2016-03-27 28 views
0

之间的差异在OpenGL ES 2.0的时候,我想一开始我用glVertexAttribPointer和glEnableVertexAttribArray与真正的参数,但该行为是完全不同的,当我用glVertexAttrib1f为什么要改变顶点着色器名为“a_degree”属性?什么是glVertexAttribPointer和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只是纹理旋转的一个点,这不是我的愿望。

回答

0

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。如果你永远不会指定它每个顶点,使用统一的值可能会更好。