OpenglES Demo1
来源:互联网 发布:linux expec参数怎么用 编辑:程序博客网 时间:2024/05/16 08:58
接触opengl已经两三年了,看过不少资料,但是都没有整理,每次用过都丢掉,最近在做引擎方面的工作,发现有些opengl的基本知识有所忘记,打算重新整理几个一下常用的内容。由于跨平台,主要是基于OpenglES 2.0 + GLSL。关于Shader以及opengles与opengl区别另起新篇。
第一个例子就完成简单light+shader吧
(1)初始化
void myInit()
{
glClearColor(0.0 , 0.0 , 0.0 , 1.0);
glEnable(GL_DEPTH_TEST);
mShader = new Shader();
mShader->Load("VertexShader");
}
void main(int argc , char** argv)
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(100 , 100);
glutInitWindowSize(600 , 600);
glutCreateWindow("GLSL_example2");
glewInit();
myInit();
glutReshapeFunc(myReshape);
glutDisplayFunc(Render);
glutIdleFunc(Render);
glutMainLoop();
}
(2)shader
vert shader:
uniform vec3 lightposition;//光源位置
uniform vec3 eyeposition;//相机位置
uniform vec4 ambient;//环境光颜色
uniform vec4 lightcolor;//光源颜色
uniform float Ns;//高光系数
uniform float attenuation;//光线的衰减系数
varying vec4 color;//向片段着色其传递的参数
void main()
{
/*顶点坐标的变换则直接可以利用内建函数ftransform()实现。当然,如果你想自己传递这些参数也是可以的。
而gl_Vertex和gl_Normal则分别表示当前传入的顶点的物体坐标系坐标和表面法向量,
gl_Position则是用来传输投影坐标系内顶点坐标的内建变量。注意内建变量是不用声明的,直接使用就行*/
vec3 ECPosition = vec3(gl_ModelViewMatrix * gl_Vertex);
vec3 N = normalize(gl_NormalMatrix * gl_Normal);
vec3 L = normalize(lightposition - ECPosition);
vec3 V = normalize(eyeposition - ECPosition);
vec3 H = normalize(V + L);
vec3 diffuse = lightcolor * max(dot(N , L) , 0);
vec3 specular = lightcolor * pow(max(dot(N , H) , 0) , Ns) * attenuation;
color = vec4(clamp((diffuse + specular) , 0.0 , 1.0) , 1.0);
color = color + ambient;
gl_Position = ftransform();
}
frag:
varying vec4 color;
void main()
{
//gl_FragColor是输出片段颜色的内建变量,凡是以gl_开头的变量都是内建变量
gl_FragColor = color;
}
(3)渲染
void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0 , 1.0 , 1.0);
/*这里是程序比较重要的地方:向给shader中的uniform变量赋值。注意赋值函数使用的位置,
只有当一个program启用的时候,里面的uniform变量才会被分配索引,
所以过早的对uniform变量赋值会长生错误。同时注意函数的格式*/
mShader->Activate();//启用shader
mShader->Uniform("lightposition",vec3(30.0 , 30.0 , 30.0));
mShader->Uniform( "eyeposition",vec3(eyeposition[0] , eyeposition[1] , eyeposition[2]));
mShader->Uniform("ambient",vec4(ambient[0] , ambient[1] , ambient[2] , ambient[3]));
mShader->Uniform("lightcolor",vec4( lightcolor[0] , lightcolor[1] , lightcolor[2] , lightcolor[3]));
mShader->Uniform("Ns",Ns);
mShader->Uniform("attenuation",attenuation);
mShader->UniformMatrix("modelViewMatrix",1 , GL_FALSE , modelViewMatrix);
glutSolidTeapot(objectSize);//绘制茶壶
mShader->Deactivate();//关闭shader
glutSwapBuffers();
}
(4)效果
- OpenglES Demo1
- demo1
- demo1
- demo1
- demo1
- opengles
- opengles
- opengles
- Opengles
- OpenGLES
- webservice demo1
- libgdx demo1
- SNMP Demo1
- 线程demo1
- bash demo1
- Grape-demo1
- socket demo1
- angularJs Demo1
- LeetCode_002:Evaluate Reverse Polish Notation
- 学习iptables
- POJ 1002 487-3279
- 一个人安静的思考...或苦或甜、或哭或笑,长在记忆里。
- hdu1143 Tri Tiling(数学:递推)
- OpenglES Demo1
- http://www.nciku.cn/conversation/detailview?convseq=753822
- git clone cm source & cm vs android version
- Palindrome Number
- 异或运算
- 操作系统之死锁——学习笔记
- 卸干净mysql
- struts2 标签库
- Surrounded Regions