2016-03-27 2 views
0

В OpenGL ES 2.0, когда я хотел изменить атрибут с именем «a_degree» в вершинном шейдере сначала я использовал glVertexAttribPointer и glEnableVertexAttribArray с истинными параметрами, но поведение совершенно другое, когда я 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"; 

использования с:

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

против

glVertexAttrib1f(m_shaderData.rotateLoc,degree); 

На самом деле glVertexAttrib1f прекрасно работать в этой ситуации, и моя текстура вращается правильно, но с glVertexAttribPointer только одна точка текстуры вращается, что не является моим желанием.

ответ

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[], хотя похоже, что вы указали только одно значение прямо сейчас как float.

Скорее всего, значения после degree в памяти являются нулями, поэтому другие точки не вращаются.

Если вы хотите, чтобы значение было одинаковым, вы можете использовать glVertexAttrib. Если вы никогда не укажете его на вершину, использование однородного значения, скорее всего, будет лучше.

Смежные вопросы