我在800x600 res窗口中渲染三角形时遇到问题。我从未在代码中调用glViewport,但结果却不正确。三角形仅渲染到窗口的下半部分。
我试图通过调用glViewport(0,0,800,1200)在我的代码中设置视口,它暂时解决了问题,但是当我进入全屏模式时,一切都再次混乱了。
#include "ref.h"
int main(void){
WindowInit(&window, "Test", WINW, WINH, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
game = GameInit(60);
VAO vaodef = VAOInit(1);
VAOCreate(&vaodef);
VAOBind(&vaodef);
const GLfloat triangle_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};
Shader triangle_shader;
LoadShader(&triangle_shader, "VertexShader.glsl", "FragmentShader.glsl");
GLuint vertexArrayBuffer;
int num_vertices = 3;
glGenBuffers(1, &vertexArrayBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffer);
glBufferData(GL_ARRAY_BUFFER, (sizeof(triangle_data) / (sizeof(GLfloat) / 3)), triangle_data, GL_STATIC_DRAW);
glUseProgram(triangle_shader.program);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, num_vertices);
glDisableVertexAttribArray(0);
glUseProgram(0);
SDL_GL_SwapWindow(window.window);
SDL_Delay(5000);
WindowDestroy(&window);
}
结果:result
最佳答案
为什么不打电话给glViewport
?这是设置绘图过程的一项基本功能。许多OpenGL初学者都误以为glViewport
是某种初始化步骤,或者在您的情况下是一种特殊化。不是。这是与绘图相关的功能!
使用OpenGL绘制窗口的惯用方式是在绘制循环的每次迭代中,将视口设置为要绘制该窗口的位置和大小。是的,重复调用它是很习惯的,因为要使用诸如帧缓冲区对象或图形叠加层元素(例如HUD)的工作需要在绘制整个帧期间多次更改视口。
因此,解决您的问题的方法是,在绘图功能的开头立即以要绘制到的可绘制区域的大小调用glViewport
。