2016-03-27 11 views
0

OpenGL 2.0では、最初に頂点シェーダで「a_degree」という名前の属性を変更したいときにglVertexAttribPointerとglEnableVertexAttribArrayをtrueパラメータで使用しましたが、glVertexAttrib1fを使用したときの動作は全く異なります。ここ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"; 

での使用:実際には

glVertexAttrib1f(m_shaderData.rotateLoc,degree); 

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

このような状況でglVertexAttrib1f作業罰金と私のテクスチャが正しくなく、一緒に回転しますglVertexAttribPointerはテクスチャの1点だけ回転しますが、私の欲望ではありません。

答えて

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を使用した場合、各点のために別々の度合いを指定する必要があります。したがって、degreefloat[]である必要がありますが、現在は1つの値をfloatとして指定しているようです。

メモリ内のdegreeの後の値はほとんどゼロであるため、他の点は回転しません。

値を同じにする場合は、glVertexAttribを使用できます。頂点ごとに決して指定しない場合は、一様な値を使用する方が良いでしょう。

関連する問題