LINUX.ORG.RU

Как в опенгл-шейдеры передать цвет в uint32_t?

 


0

2

Всем привет!

Собственно, сабж.

Вот код шейдеров и то, как туда передаются данные:

const char *vertexShaderSource ="#version 420 core\n"
    "layout (location = 0) in vec4 aPos;\n"
    "layout (location = 1) in vec4 aColor;\n"
    "out vec4 ourColor;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.xyz, 1.0);\n"
    "   gl_PointSize = aPos.w;\n"
    "   ourColor = aColor.rgba;\n"
    "}\0";

const char *fragmentShaderSource = "#version 420 core\n"
    "out vec4 FragColor;\n"
    "in vec4 ourColor;\n"
    "void main()\n"
    "{\n"
    "   vec2 circCoord = 2.0 * gl_PointCoord - 1.0;\n"
    "   if (dot(circCoord, circCoord) > 1.0) {\n"
    "        discard;\n"
    "   }\n"
    "   FragColor = ourColor;\n"
    "}\n\0";

//---- usage: ----
    struct point
    {
        uint64_t id;
        float x;
        float y;
        float z;
        float size;
        uint32_t color;
        /*float r;
        float g;
        float b;
        float a;*/
    };
    // bla-bla-bla
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    // position attribute
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(point), (void*)(sizeof(uint64_t)));
    glEnableVertexAttribArray(0);
    // color attribute
    glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, sizeof(point), (void*)(sizeof(uint64_t) + 4 * sizeof(float)));
    glEnableVertexAttribArray(1);

При этом я проверил, что при передаче компонент цвета как float все работает как надо, но хочется снизить размер передаваемых данных.

ЧЯДНТ?

★★
                                 normalized v
glVertexAttribPointer(?,3,GL_UNSIGNED_BYTE, 1 ,?,?);
glVertexAttribPointer(?,1,GL_UNSIGNED_INT,  1 ,?,?);

Не проверял.
anonymous
()

Попробуй заменить

glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, sizeof(point), (void*)(sizeof(uint64_t) + 4 * sizeof(float)));

на

glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(point), (void*)(sizeof(uint64_t) + 4 * sizeof(float)));

и еще надо учитывать порядок байт при записи цвета в uint32_t. С массивом байт было бы проще.

anonymous
()
Ответ на: комментарий от anonymous

Да с чего бы? выравнивание верно же проставлено (от большего к меньшему).

aido ★★
() автор топика
Ответ на: комментарий от aido

А если из шейдера просто константу возвращать - работает? А то может ты не там проблему ищешь.

anonymous
()
Ответ на: комментарий от aido

Работает, рисует точку. Только glad закомментировал и добавил в начало #define GL_GLEXT_PROTOTYPES и #define GLX_GLXEXT_PROTOTYPES.

Наверное дровам не нравится что у тебя контекст 3.3 а шейдеры 4.2.

Для отладки добавть в код

glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageControl(GL_DONT_CARE,GL_DONT_CARE,GL_DONT_CARE,0,0,1);
glDebugMessageCallback([](auto,auto,auto,auto,auto,auto e,auto){puts(e);},0);

anonymous
()
Ответ на: комментарий от aido

Ещё, на швабодных дровах последний опенгл может работать, если запускать с переменными окружения MESA_GL_VERSION_OVERRIDE=4.6FC MESA_GLSL_VERSION_OVERRIDE=460

anonymous
()
Ответ на: комментарий от anonymous

Поправил на 4,2 - ничего не изменилось.

Я счас начал отлаживаться и... есть у меня подозрение, что где-то создается временный объект, который содержит мусор.

aido ★★
() автор топика
Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от anonymous
/prj/sphere/test/src/test.cpp: In function ‘int main()’:
/prj/sphere/test/src/test.cpp:53:14: error: ‘GL_DEBUG_OUTPUT’ was not declared in this scope
     glEnable(GL_DEBUG_OUTPUT);
              ^~~~~~~~~~~~~~~
/prj/sphere/test/src/test.cpp:53:14: note: suggested alternative: ‘_IOS_OUTPUT’
     glEnable(GL_DEBUG_OUTPUT);
              ^~~~~~~~~~~~~~~
              _IOS_OUTPUT
/prj/sphere/test/src/test.cpp:54:14: error: ‘GL_DEBUG_OUTPUT_SYNCHRONOUS’ was not declared in this scope
     glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/prj/sphere/test/src/test.cpp:55:5: error: ‘glDebugMessageControl’ was not declared in this scope
     glDebugMessageControl(GL_DONT_CARE,GL_DONT_CARE,GL_DONT_CARE,0,0,1);
     ^~~~~~~~~~~~~~~~~~~~~
/prj/sphere/test/src/test.cpp:56:5: error: ‘glDebugMessageCallback’ was not declared in this scope
     glDebugMessageCallback([](auto,auto,auto,auto,auto,auto e,auto){puts(e);},0);
     ^~~~~~~~~~~~~~~~~~~~~~
/prj/sphere/test/src/test.cpp:56:5: note: suggested alternative: ‘glfwSetDropCallback’
     glDebugMessageCallback([](auto,auto,auto,auto,auto,auto e,auto){puts(e);},0);
     ^~~~~~~~~~~~~~~~~~~~~~
     glfwSetDropCallback
aido ★★
() автор топика
Ответ на: комментарий от anonymous

Елки-палки... Little/Big-Endian... Я уж забыл о нем.

aido ★★
() автор топика
Ответ на: комментарий от aido

А можешь еще подсказать, как эффект гало сделать без использования текстур?

shadertoy.com там смотри

missxu
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.