Почему при копировании значения из ввода вершинного шейдера в вывод вершинного шейдера (плоский) получается другое значение? - PullRequest
1 голос
/ 16 января 2020

Я рендеринг текстурированных квадратов (в пространстве экрана), и я хочу указать текстуру в данных вершины, отправить как плоский вывод в шейдер фрагмента, и использовать для выбора текстуры. Значение изменяется во время этого процесса. В RenderDo c вход VS равен 2, а вывод - 1073741824 (для каждой вершины). Кто-нибудь есть идеи, почему? (Основной контекст 4.6, шейдеры #version 460). Я загружаю 6 вершин на каждый квад и использую glDrawArrays (). Этап текстуры 0 работает, но любое ненулевое значение преобразуется.

layout(location=0) in vec3 coord3d;
layout(location=1) in vec2 uvIn;
layout(location=2) in vec3 colorIn;
layout(location=3) in unsigned int textureStageIn;

out vec4 color;
out vec2 uv;
flat out unsigned int textureStage;

void main(void)
{
    gl_Position = vec4( coord3d, 1.0 );
    color = vec4(colorIn,1.0); 
    uv = uvIn;
    textureStage = textureStageIn;
}
in vec4 color;
in vec2 uv;
flat in unsigned int textureStage;

uniform sampler2D tex00;
uniform sampler2D tex01;
uniform sampler2D tex02;

out vec4 outpColor;

void main(void)
{
    vec2 uvDx = dFdx(uv);
    vec2 uvDy = dFdy(uv);

    switch ( textureStage )
    {
        case 0:
            outpColor = textureGrad(tex00, uv, uvDx, uvDy );
            break;
        case 1:
            outpColor = textureGrad(tex01, uv, uvDx, uvDy );
            break;
        case 2:
            outpColor = textureGrad(tex02, uv, uvDx, uvDy );
            break;
        default:
            outpColor = color;
            break;
    }
} 

1 Ответ

2 голосов
/ 16 января 2020

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

Обратите внимание, что параметр type этой функции указывает только тип исходных данных, но ничего не говорит о типе атрибута. Для каждого базового типа атрибута (с плавающей запятой, целочисленного, с плавающей запятой 64-битной двойной точности) существует отдельная функция.

...