Цвет не работает в стартовых примерах opengl - PullRequest
0 голосов
/ 08 января 2019

Изображение маленького (черного) квадрата, должно быть радужным (изменяющим цвета, нарисованным от одного к другому), но почему это глупо к черному.

При этом он из рисовался, а не выкинул ошибку.

вот код для рисования маленького черного квадрата.

начальные учебники basic.vert и basic.frag standart (первые экзамены).

void My_TwoSquares()
{
    GLfloat vertires[] =
    {
        -0.2f, -0.2f, 0.0f,
        -0.2f, 0.2f, 0.0f,
        0.2f, 0.2f, 0.0f,
        0.2f, -0.2f, 0.0f,
    };
     // color 
    GLfloat cwet[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f
    };

    GLuint indices[] =
    {
        0,1,2, 
        0,2,3  
    };

    GLuint iboHandle;
    GLuint vaoHandle;
    GLuint vboHandles[2];

    glGenBuffers(2, vboHandles);
    GLuint positionBufferHandle = vboHandles[0];
    GLuint colorBufferHandle = vboHandles[1];

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
    glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), vertires, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
    glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), cwet, GL_STATIC_DRAW);

    glGenVertexArrays(1, &vaoHandle);
    glBindVertexArray(vaoHandle);

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    glGenBuffers(1, &iboHandle);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboHandle);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLuint), indices, GL_STATIC_DRAW);

    ShaderProgram shaderprogram;
    shaderprogram.loadShaders("basic.vert", "basic.frag");
    shaderprogram.use();

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

}

вот шейдеры basic.frag и basic.vert

basic.frag

#version 330 core

uniform vec4 vertColor;
out vec4 frag_color;

void main()
{
    frag_color = vertColor;
}

basic.vert

#version 330 core

layout (location = 0) in vec3 pos;

uniform vec2 posOffset;

void main()
{
        gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}

enter image description here

1 Ответ

0 голосов
/ 09 января 2019

В вашем коде шейдера vertColor является переменной Uniform . Эта унифицированная переменная никогда не устанавливается, и инициализация унифицированной переменной по умолчанию равна 0 для всех компонентов. Это приводит к тому, что прямоугольник окрашивается в черный цвет.

Но у вас есть атрибуты вершин. Каждая координата вершины связана с одним цветом. Вы должны добавить вход в Вершинный шейдер для атрибута цвета ( Ввод вершинного шейдера ).

#version 330 core

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;

Этот атрибут должен быть передан в Фрагментный шейдер с помощью вывода вершинного шейдера ( Вывод вершинного шейдера ),

out vec3 vColor;

void main()
{
    vColor = color;
    // [...]
}

к входу в фрагментный шейдер ( входной фрагментный шейдер ):

in vec3 vColor;

Выходные данные вершинного шейдера (как и цвет) интерполируются в соответствии с его положением в примитиве (треугольник) ( Барицентрические координаты ). Входными данными для фрагментного шейдера является интерполированный атрибут.
С помощью этой техники можно получить градиент цвета.

Вершинный шейдер

#version 330 core

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;

out vec3 vColor;

uniform vec2 posOffset;

void main()
{
    vColor      = color;
    gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}

Фрагмент шейдера

#version 330 core

in  vec3 vColor;
out vec4 frag_color;

void main()
{
    frag_color = vec4(vColor.rgb, 1.0);
}
...