GLSL OpenGL полигоны не рендеринг

0

Я пытаюсь использовать шейдеры OpenGL для рисования простого треугольника. Я попытался разделить код на отдельные методы внутри одного всеобъемлющего класса рендеринга, однако, похоже, я не могу отобразить свой треугольник на экране. Это мой метод compileShaders(), который компилирует и загружает исходный код шейдера:

static const GLchar* vertexShaderSource[] = {
    "#version 430 core                          \n"
    "in vec4 vPosition;                         \n"
    "in vec4 vColor;                            \n"
    "out vec4 color;                            \n"
    "                                           \n"
    "void main() {                              \n"
    "   color = vColor;                         \n"
    "   gl_Position = vPosition;                \n"
    "}                                          \n"
};

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, vertexShaderSource, NULL);
glCompileShader(vertexShader);

program = glCreateProgram();
glAttachShader(program, vertexShader);
glLinkProgram(program);

glDeleteShader(vertexShader);

return program;

В другом методе я вызываю glewInit(), compileShaders(), а затем настраиваю объекты массива вершин и вершин. В этом методе triangleVertices [] и triangleColors [] представляют собой две массивы, содержащие позицию (x, y, z) и значения цвета (r, g, b, a) для каждой вершины треугольника.

glewInit();
renderingProgram = compileShaders();

glEnable(GL_ARRAY_BUFFER);
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, numberOfVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, numberOfVertices*3*sizeof(GLfloat), triangleVertices);
glBufferSubData(GL_ARRAY_BUFFER, numberOfVertices*3*sizeof(GLfloat), numberOfVertices*4*sizeof(GLfloat), triangleColors);

GLuint vpos = glGetAttribLocation(renderingProgram, "vPosition"); 
glVertexAttribPointer(vpos, 3, GL_FLOAT, GL_FALSE, 0, 0); 

GLuint cpos = glGetAttribLocation(renderingProgram, "vColor");
glVertexAttribPointer(cpos, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numberOfVertices*3*sizeof(GLfloat)));   

glUseProgram(renderingProgram);
glEnableVertexAttribArray(vpos);
glEnableVertexAttribArray(cpos);

Наконец, мой метод render(), в котором я пытаюсь и рисую Треугольник, загруженный в буфер массива:

const GLfloat color[] = {0.0f, 0.0f, 1.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);

glUseProgram(renderingProgram);

glDrawArrays(GL_TRIANGLES, 0, 3);
SwapBuffers(hDC_);

Я обрабатываю окно Win32, которое настроено в другом классе. После рендеринга я вижу синий экран, поэтому он выглядит так, как будто вызов glClearBufferfv работает правильно. Однако мой треугольник нигде не видно. Если изменить режим рендеринга на glDrawArrays(GL_POINTS, 0, 1) я вижу один белый пиксель в середине экрана.

Что я делаю не так?

Теги:
opengl
glsl

1 ответ

1
Лучший ответ

Как указывали другие, вам нужен также шейдер фрагмента, например,

#version 430

in vec4 color;
out vec4 frag_rgba; // default index (0) (glFragBindDataLocation)

void main (void) {
    frag_rgba = color;
}

Прикрепите этот шейдер к программе вместе с вершинным шейдером перед связыванием. После связывания вы можете отсоединить шейдеры от программы. Вы также можете рассмотреть использование явных индексов атрибутов в вершинном шейдере.

  • 0
    Я добавил фрагментный шейдер, и это, похоже, решило проблему. Также похоже, что мои шейдеры не компилировались должным образом с использованием version 430 core . Как только я изменил это на version 330 core оно скомпилировалось! Большое спасибо за помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню