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)效果



0 0
原创粉丝点击