我正在尝试使用着色器上的着色器进行旋转,这是我的着色器的代码:
"#version 150 core\n"
"in vec2 position;"
"in vec3 color;"
"out vec3 Color;"
"uniform mat4 rotation;"
"void main() {"
" Color = color;"
" gl_Position = rotation*vec4(position, 0.0, 2.0);"
"}";
我正在使用quat,这是产生matrice的代码并将其转储到着色器中:
glm::quat rotation(x,0.0,0.0,0.5);
x+=0.001;
ctm = glm::mat4_cast(rotation);
GLint matrix_loc;
// get from shader pointer to global data
matrix_loc = glGetUniformLocation(shaderProgram, "rotation");
if (matrix_loc == -1)
std::cout << "pointer for rotation of shader not found" << matrix_loc << std::endl;
// put local data in shader :
glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, glm::value_ptr(ctm));
但是当它旋转时,对象变得越来越大,我知道每次迭代循环时我都不需要GetUniformLocation,但这是测试的代码。据我所知,GlUniformMatrix应该让旋转发生。在这些调用之后,我只是绘制我的顶点数组。
答案 0 :(得分:1)
鉴于它仍在绘制,着色器中的rotation
可能是一个有效的矩阵。如果它是制服的一个问题,它可能都是零,没有任何东西可以画。
正如@genpfault所说,ctm需要初始化:
ctm = glm::mat4_cast(rotation);
请参阅:Converting glm quaternion to rotation matrix and using it with opengl
此外,2.0
中的vec4(position, 0.0, 2.0)
不应该是1.0
吗?