我在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

10-08 11:24