2016-03-27 6 views
0

En opengl es 2.0 quand je voulais changer l'attribut "a_degree" dans vertex shader au début j'ai utilisé glVertexAttribPointer et glEnableVertexAttribArray avec de vrais paramètres mais le comportement est totalement différent quand j'ai utilisé glVertexAttrib1f pourquoi?Quelles sont les différences entre glVertexAttribPointer et glVertexAttrib1f

voici mon code shader:

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"; 

utiliser avec:

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

vs

glVertexAttrib1f(m_shaderData.rotateLoc,degree); 

En fait glVertexAttrib1f fonctionnent très bien dans cette situation et ma texture tourner correctement, mais avec glVertexAttribPointer juste un point de la rotation de la texture qui n'est pas mon désir.

Répondre

0

glVertexAttrib permet de spécifier une valeur fixe pour l'attribut.

En revanche, glVertexAttribPointer lorsqu'il est activé via glEnableVertexAttribArray vous permet de spécifier une valeur unique pour chaque sommet.

En savoir plus ici: https://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttrib.xml https://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml

Donc, si vous dessinez un triangle avec de multiples points, vous devez spécifier un degré distinct pour chaque point lors de l'utilisation glVertexAttribPointer. Ainsi, degree devrait être un float[], alors qu'il semble que vous ne spécifiez qu'une seule valeur en tant que float. Probablement les valeurs après degree en mémoire sont des zéros, ce qui explique pourquoi les autres points ne tournent pas. Si vous souhaitez que la valeur soit identique, vous pouvez utiliser glVertexAttrib. Si vous ne le spécifiez jamais par sommet, l'utilisation d'une valeur uniforme est probablement préférable.