OpenGLShader01.attributeuniformvaryinginout
Posted stq_wyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGLShader01.attributeuniformvaryinginout相关的知识,希望对你有一定的参考价值。
接下来我们要进入OpenGL三部曲的最后一部了,OpenGLShader的语法及案例。
1.attribute:根据OpenGL2.0和OpenGLES2.0标准,仅用在VertexShader中,至少支持8个attribute属性。OpenGL3.0里,至少支持16个。通常用来存储位置坐标、法向量、纹理坐标和颜色等。我们在上一阶段的OpenGL学习中每个Shader都有用到。
attribute vec4 position;
attribute vec4 color;
attribute vec4 texcoord;
attribute vec4 normal;
在C++中先获取在哪个属性组:
mPositionLocation = glGetAttribLocation(mProgram, "position");
mColorLocation = glGetAttribLocation(mProgram, "color");
mTexcoordLocation = glGetAttribLocation(mProgram, "texcoord");
mNormalLocation = glGetAttribLocation(mProgram, "normal");
设置VBO与通用属性组关系:
glEnableVertexAttribArray(mPositionLocation);
glVertexAttribPointer(mPositionLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glEnableVertexAttribArray(mColorLocation);
glVertexAttribPointer(mColorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 4));
glEnableVertexAttribArray(mTexcoordLocation);
glVertexAttribPointer(mTexcoordLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 8));
glEnableVertexAttribArray(mNormalLocation);
glVertexAttribPointer(mNormalLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 12));
2.unifrom:可存在所有shader中,OpenGL2.0中,数量至少有128个。可存放矩阵、材质等任何attribute放不下的属性。
uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
在C++中,先获取位置:
mModelMatrixLocation = glGetUniformLocation(mProgram, "ModelMatrix");
mViewMatrixLocation = glGetUniformLocation(mProgram, "ViewMatrix");
mProjectionMatrixLocation = glGetUniformLocation(mProgram, "ProjectionMatrix");
设置参数:
glUniformMatrix4fv(mModelMatrixLocation, 1, GL_FALSE, M);
glUniformMatrix4fv(mViewMatrixLocation, 1, GL_FALSE, V);
glUniformMatrix4fv(mProjectionMatrixLocation, 1, GL_FALSE, P);
3.varying:用于shader之间的数据传递,在OpenGL2.0。最多传递8个Vec4大小的数据,即2个mat4矩阵。
varying vec4 V_Texcoord;
4.in:表示某个Shader阶段的输入。varying可以改为in。即fs中的输入为vs中的输出。
5.out:代表每个shader的输出。也可以代替varying。in和out在3.0之后的版本使用。
以上是关于OpenGLShader01.attributeuniformvaryinginout的主要内容,如果未能解决你的问题,请参考以下文章
OpenGLShader01.attributeuniformvaryinginout