【发布时间】:2018-03-25 23:39:40
【问题描述】:
我开始学习 OpenGL 并做一些早期示例来了解 API 如何使用它。我目前坚持的,是一个旋转的例子。代码(在下面提供)应该从 4 个顶点创建一个 2D 正方形,并围绕 Z 轴应用 30º 的旋转。显然,代码看起来很好,我已经看到它在我教授的机器上运行并且它可以工作。如果我绘制正方形而不在着色器中应用旋转,程序当然会绘制正方形,但不旋转。
这可能是由一些错误的配置引起的吗?所有其他示例似乎都可以正常工作。
代码如下:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "Angel.h"
glm::vec2 vertices[4] = {
glm::vec2( -0.5, -0.5 ),
glm::vec2( 0.5, -0.5 ),
glm::vec2( 0.5, 0.5 ),
glm::vec2( -0.5, 0.5 ),
};
const int NumPoints = 6;
glm::vec2 points[NumPoints];
void square( ){
points[0] = vertices[0];
points[1] = vertices[1];
points[2] = vertices[2];
points[3] = vertices[0];
points[4] = vertices[2];
points[5] = vertices[3];
}
GLuint matRot;
void init( void ){
square();
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
GLuint buffer;
glGenBuffers( 1, &buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
GLuint program = InitShader( "vshader1.glsl", "fshader1.glsl" );
glUseProgram( program );
GLuint loc = glGetAttribLocation( program, "vPosition" );
glEnableVertexAttribArray( loc );
glVertexAttribPointer( loc, 2, GL_FLOAT, GL_FALSE, 0,
BUFFER_OFFSET(0) );
matRot = glGetUniformLocation( program, "rot" );
glClearColor( 1.0, 1.0, 1.0, 1.0 );
}
void display( void ){
glClear( GL_COLOR_BUFFER_BIT );
glm::mat4 rotZ;
rotZ = glm::rotate(rotZ, glm::radians(30.0f), glm::vec3(0.0f,0.0f,1.0f));
glUniformMatrix4fv(matRot,1,GL_FALSE, glm::value_ptr(rotZ));
glDrawArrays( GL_TRIANGLES, 0, NumPoints );
glFlush();
}
int main( int argc, char **argv ){
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGBA );
glutInitWindowSize( 512, 512 );
glutInitWindowPosition(0,0);
glutCreateWindow( "square rotation" );
glewInit();
init();
glutDisplayFunc( display );
glutMainLoop();
return 0;
}
Angel.h 是一个附加资源,有助于对所有这些库进行一些管理。可以找到here,InitShader 的实现是here
顶点着色器:
#version 130
in vec4 vPosition;
uniform mat4 rot;
void main()
{
gl_Position = rot * vPosition;
}
如果我不乘rot * vPosition,则绘制“未旋转”的正方形
碎片着色器:
#version 130
out vec4 fColor;
void main()
{
fColor = vec4( 1.0, 0.0, 0.0, 1.0 );
}
【问题讨论】:
-
这有什么关系?它可能会以错误的角度旋转,而不是 30 度。但是 OP 说他没有看到任何轮换。
-
静态方法是
glm::degress(30.0f)rigth?我试过这种方式,但仍然是一个空白窗口 -
您需要为此升级显卡驱动程序。新的显卡驱动程序将与新版本的 OpenGL 和 GLSL 一起提供。
-
@ParitoshKulkarni 我有版本 0.9.9-a1 并尝试了两种方式(
glm::degress(30.0f)和30.0f,但效果不佳 -
我认为只是更新驱动程序也更改为双缓冲替换 glutInitDisplayMode( GLUT_SINGLE | GLUT_RGBA );到 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
标签: c++ opengl rotation glsl glut