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

OpenGLShader01.attributeuniformvaryinginout

OpenGLShader错误 检测

Modern OpenGLShader

OpenGLShader实例分析- 雪花飘落效果

OpenGLShader实例分析- AngryBots中的主角受伤特效