OpenGL неправильный видовой экран - PullRequest
0 голосов
/ 02 октября 2019

У меня проблема с рендерингом треугольника в окне разрешения 800x600. Я никогда не вызывал 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);
}

Результаты: результат

1 Ответ

1 голос
/ 02 октября 2019

Почему ты не звонишь glViewport? Это важная функция, которая устанавливает процесс рисования. Многие новички в OpenGL ошибочно полагают, что glViewport - это своего рода этап инициализации или, в вашем случае, специализация. Это не. Это функция, связанная с рисованием!

Идиоматический способ рисования в окне с OpenGL начинается с установки области просмотра в положение и размер, в котором это окно вы хотите нарисовать, вкаждая итерация цикла рисования . Да, идиоматично вызывать его повторно, поскольку, например, при работе с объектами кадрового буфера или при рисовании наложенных элементов, таких как HUD, требуется несколько раз изменять область просмотра на протяжении всего рисования кадра.

Решением вашей проблемы является вызов glViewport с размером области рисования, в которую вы хотите рисовать, прямо в начале функции рисования.

...