glVertexAttribPointer 和 glVertexAttrib1f 之间有什么区别
What is differences between glVertexAttribPointer and glVertexAttrib1f
在 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, °ree );
对
glVertexAttrib1f(m_shaderData.rotateLoc,degree);
事实上,glVertexAttrib1f 在这种情况下工作正常,我的纹理旋转正确,但 glVertexAttribPointer 只是纹理旋转的一个点,这不是我想要的。
glVertexAttrib
允许您为属性指定一个固定值。
相比之下,当通过 glEnableVertexAttribArray
启用时,glVertexAttribPointer
允许您为每个顶点指定一个唯一值。
在此处阅读更多内容:
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[]
,而看起来您现在只是将单个值指定为 float
.
内存中degree
之后的值很可能是零,这就是其他点不旋转的原因。
如果你想要相同的值,你可以使用glVertexAttrib
。如果您永远不会为每个顶点指定它,使用统一值可能会更好。
在 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, °ree );
对
glVertexAttrib1f(m_shaderData.rotateLoc,degree);
事实上,glVertexAttrib1f 在这种情况下工作正常,我的纹理旋转正确,但 glVertexAttribPointer 只是纹理旋转的一个点,这不是我想要的。
glVertexAttrib
允许您为属性指定一个固定值。
相比之下,当通过 glEnableVertexAttribArray
启用时,glVertexAttribPointer
允许您为每个顶点指定一个唯一值。
在此处阅读更多内容: 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[]
,而看起来您现在只是将单个值指定为 float
.
内存中degree
之后的值很可能是零,这就是其他点不旋转的原因。
如果你想要相同的值,你可以使用glVertexAttrib
。如果您永远不会为每个顶点指定它,使用统一值可能会更好。