glVertexAttribPointer和glVertexAttrib1f之间有什么区别?

时间:2016-03-27 08:39:48

标签: opengl-es-2.0 opengl-4

在opengl es 2.0中,当我想在顶点着色器中更改名为“a_degree”的属性时,我使用了glVertexAttribPointer和glEnableVertexAttribArray以及真正的参数,但当我使用glVertexAttrib1f时,行为完全不同?

这是我的着色器代码:

const char* CGraphic::VERTEX_SHADER_SOURCE =
"attribute vec4 a_position;     \n"
"attribute vec2 a_texCoord;     \n"
"attribute vec4 a_color;        \n"
"attribute float a_degree;      \n"
"varying lowp vec4 v_color;     \n"
"varying vec2 v_texCoord;       \n"
"void main()                    \n"
"{                              \n"
"   float radianS = a_degree*   "
"   (3.14159265/180.0);         \n"
"   float s = sin(radianS);     \n"
"   float c = cos(radianS);     \n"
"   mat4 mvpMatrix=mat4(        \n"
"       c,-s,0,0,               "
"       s,c,0,0,                "
"       0,0,1,0,                "
"       0,0,0,1);             \n"
"   v_color = a_color;        \n"
"   gl_Position = a_position*mvpMatrix; \n"
"   v_texCoord = a_texCoord;  \n"
"}                            \n";

const char* CGraphic::FRAGMENT_SHADER_SOURCE =
"precision mediump float;     \n"
"                             \n"
"varying vec4 vColor;         \n"
"varying vec2 v_texCoord;     \n"
"uniform sampler2D s_texture; \n"
"                             \n"
"void main()                  \n"
"{                            \n"
"  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
"}                            \n";

用于:

glEnableVertexAttribArray ( m_shaderData.rotateLoc );
glVertexAttribPointer ( m_shaderData.rotateLoc, 1, GL_FLOAT,
                            GL_FALSE, 0, &degree );

VS

glVertexAttrib1f(m_shaderData.rotateLoc,degree);

事实上glVertexAttrib1f在这种情况下运行正常,我的纹理正确旋转但是glVertexAttribPointer只是纹理旋转的一个点,这不是我的愿望。

1 个答案:

答案 0 :(得分:0)

glVertexAttrib允许您为属性指定固定值。

相反,glVertexAttribPointer通过glEnableVertexAttribArray启用时,可以为每个顶点指定唯一值。

在这里阅读更多内容: https://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttrib.xml https://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml

因此,如果要绘制具有多个点的三角形,则需要在使用glVertexAttribPointer时为每个点指定单独的度数。因此,degree需要float[],而您现在只需将{1}}指定为单个值。

内存中float之后的值很可能是零,这就是其他点不旋转的原因。

如果您希望值相同,则可以使用degree。如果你永远不会为每个顶点指定它,那么使用统一值可能会更好。