GLSL конвертирует уинт в плавающий цвет - PullRequest
0 голосов
/ 25 сентября 2018

Для моей программы я хочу передать данные в вершинный шейдер в виде байтов без знака, а затем преобразовать байты в значение с плавающей запятой (между 0,0 и 1,0) для цвета в вершинном шейдере примерно так:

#version 330 core
layout (location = 0) in uvec3 aPos;
layout (location = 1) in uvec4 aColor;

out VS_OUT {
    vec4 color;
} vs_out;

void main()
{
    vs_out.color = vec4(float(aColor.r) / 255.0f, float(aColor.g) / 255.0f, float(aColor.b) / 255.0f, 1.0f); //alpha set to 1 temporarily
    gl_Position = vec4(aPos, 1.0);
}

однако, неважно, как я выполняю конструкторы или операции, он всегда будет конвертироваться в 1,0, когда введенные значения байтов равны нулю, кроме 0 (ноль приводит к 0,0).Как я могу это исправить, чтобы получить правильные значения цвета от 0,0 до 1,0?(или это ошибка в openGL 3.3?)

код для передачи данных:

unsigned char test[] = {
        0, 0, 0, 255, 1, 10, 255, 0, 255 //first 3 is position and next 4 is color but still outputs white
    };
    unsigned int VBO, VAO;
    glGenBuffers(1, &VBO);
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(test), &test, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_UNSIGNED_BYTE, GL_FALSE, 9*sizeof(byte), 0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, 9 * sizeof(byte), (void*)(3 * sizeof(BYTE)));
    glBindVertexArray(0);
...
// draw points
        ourShader.use();// use pre-defined shaders
        glBindVertexArray(VAO);
        glDrawArrays(GL_POINTS, 0, 1);

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я понял это.Я могу просто поместить значения in в шейдер как vec4 вместо uvec4 и установить атрибут vertex для нормализации, и программа автоматически преобразует его:

vertex shader:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec4 aColor;

out VS_OUT {
    vec4 color;
} vs_out;

void main()
{
    vs_out.color = aColor;
    gl_Position = vec4(aPos, 1.0); 
}

programкод:

byte test[] = {//unsigned char
        0, 0, 0, 25, 100, 136, 255, 0, 255 // ouputs teal color (index 3-6)
    };
...

    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, (9 * sizeof(byte)), (void*)(3 * sizeof(BYTE)));
0 голосов
/ 26 сентября 2018

Если вы хотите прочитать целые числа в шейдере, тогда используйте glVertexAttribIPointer вместо glVertexAttribPointer (обратите внимание на 'I')

BTW, ваш буфер имеет 9 значений, но только 7В настоящее время используются.Если вы планируете чередовать больше значений (pos, color, pos, color и т. Д.), Просмотрите параметр " stride ";это должно быть 7 вместо 9. Ну, я не думаю, что вы хотите тратить 2 x numOfVert неиспользованных байтов только для того, чтобы сохранить этот шаг = 9.

...