Ошибочные значения фрагментного шейдера GLSL

Когда я пытаюсь передать единый uint фрагментному шейдеру из вершинного шейдера, он меняет значение. Я подтвердил, что значение 1 в вершинном шейдере, изменив положение, если значение не равно 1. Если значение 1 во фрагментном шейдере, вместо диффузного цвета отображается диффузная текстура. Код выглядит следующим образом. Кроме того, я пытался передать его как значение в едином vec2, но это тоже не сработало.

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

#version 410
// Layouts
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
// Uniforms (matrices)
uniform mat4 model, view, proj;
// Uniforms (texture)
uniform uint useDiffuseTexture;
// Uniforms (shininess)
uniform float shininess;
uniform float shininessStrength;
// Uniforms (colour)
uniform vec3 diffuseColour;
uniform vec3 specularColour;
// Outputs (texture)
out uint UseDiffuseTexture;
out vec2 TexCoord;
// Outputs (colour)
out vec3 DiffuseColour;
out vec3 SpecularColour;
// Outputs (shininess)
out float Shininess;
out float ShininessStrength;
void main() {
    UseDiffuseTexture = useDiffuseTexture;
    TexCoord = texCoord;
    if(useDiffuseTexture == 1)
        gl_Position = proj * view * model * vec4(position, 1.0);
    else
        gl_Position = vec4(position, 1.0);
}

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

#version 410
// Inputs (texture)
in vec2 TexCoord;
uniform sampler2D diffuseTexture;
// Uniforms (texture)
uniform uint UseDiffuseTexture;
// Uniforms (colour)
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;
// Uniforms (shininess)
uniform float Shininess;
uniform float ShininessStrength;
// Output
out vec4 fragColour;
void main() {
    vec4 texColour = vec4(DiffuseColour, 1.0);;
    if(UseDiffuseTexture == 1)
        texColour = texture(diffuseTexture, TexCoord);

    if(texColour.a < 0.2)
        discard;

    fragColour = texColour;
}

person jellyfishcoder    schedule 21.02.2017    source источник


Ответы (2)


Чувак, неправильные определения: D. Изменять

uniform uint UseDiffuseTexture;
uniform vec3 DiffuseColour;
uniform vec3 SpecularColour;

в вашем фрагментном шейдере с

in uint UseDiffuseTexture;
in vec3 DiffuseColour;
in vec3 SpecularColour;

просто потому, что вы передаете его через вершинный шейдер, а ваш фрагментный шейдер ожидает 4 IN, поскольку ваш вершинный шейдер имеет 4 OUT ...

person Robert    schedule 21.02.2017
comment
Первоначальная причина, по которой я использовал uniform, заключалась в том, что всякий раз, когда я ее компилирую, говорится, что uint не может быть in во фрагментном шейдере. - person jellyfishcoder; 21.02.2017
comment
вы использовали glUniform1ui для useDiffuseTexture? - person Robert; 21.02.2017
comment
и, кстати, я бы избегал использования одного и того же имени для переменных в GLSL только по соображениям безопасности, поэтому вам следует попробовать изменить uint useDiffuseTexture на: out uint useDiffTex; - person Robert; 21.02.2017
comment
Да, я это сделал, проблема не в передаче его в вершинный шейдер. Фрагментный шейдер даже не будет компилироваться, если у него есть uint или int в качестве 'in'. Это точный результат: ERROR: 0: 8: unsigned int не может быть in во фрагментном шейдере - person jellyfishcoder; 21.02.2017
comment
Вот почему: входные данные фрагментного шейдера, которые являются целыми числами со знаком или без знака, целочисленными векторами или любым типом с плавающей запятой двойной точности, должны быть квалифицированы с помощью квалификатора интерполяции flat. (Входные переменные GL 4.5, раздел 4.3.4), поэтому он никогда не будет интерполировать типы uint или int в GLSL ... - person Robert; 21.02.2017
comment
Ну, вы даже заставили меня проверить это ... Вот ваше решение: всякий раз, когда вам нужно установить что-то в своем шейдере фрагмента, объявляйте там свою униформу (это прекрасно работало с типом float AND bool :)). Так что оставьте свою униформу во фрагментном шейдере и избавьтесь от нее в вершинном шейдере ... - person Robert; 21.02.2017
comment
Хорошо, спасибо, я не знал, что вы можете сделать это с чем угодно, кроме сэмплеров. Это намного удобнее, чем передавать его во фрагментный шейдер! - person jellyfishcoder; 21.02.2017
comment
в любое время, иди, почему я не сказал этого с самого начала ... может быть, это просто потому, что я устал или что-то в этом роде ...: D - person Robert; 21.02.2017

person    schedule
comment
Затем он говорит, что у вас не может быть uint как in в шейдере фрагментного шейдера. Это точное сообщение: ERROR: 0: 8: unsigned int не может быть in во фрагментном шейдере - person jellyfishcoder; 21.02.2017
comment
Да, они могут быть uint, но затем квалифицируйте их с помощью flat. Редактирую свой ответ. - person Ripi2; 21.02.2017