OpenGL не может найти некоторые однородные переменные - PullRequest
1 голос
/ 26 января 2020

Я работаю над системой освещения для OpenGL и по какой-то причине OpenGL не может найти некоторые однородные переменные, которые я использую в фрагментном шейдере. Имена переменных reflection и useReflectionMap, и это мой фрагментный шейдер:

#version 330 core

out vec4 color;

in vec3 Vertex;
in vec2 UV;
in vec3 Normal;


uniform sampler2D tex;
uniform vec3 viewPos;


const float linear = 0.09f;
const float quadratic = 0.032f;

const float specularStrength = 1.0f;
const vec3 ambientLight = vec3(0.2f);


struct LightSourceData {
    vec3 lightColor;
    vec3 lightPos;
};

uniform LightSourceData lights[30];
uniform int validObjects;
uniform int reflection;
uniform int useReflectionMap;
uniform sampler2D reflectionMap;

void main() {
    vec3 result = vec3(0.0f);

    color = vec4(viewPos, 1.0f);

    for(int i = 0; i < validObjects; i++) {
        vec3 normal = normalize(Normal);

        vec3 lightDir = normalize(lights[i].lightPos - Vertex);
        vec3 diffuse = max(dot(normal, lightDir), 0.0) * lights[i].lightColor;

        vec3 viewDir = normalize(viewPos - Vertex);
        vec3 reflectDir = reflect(-lightDir, normal);

        vec3 specular;
        if(useReflectionMap == 0) {
            specular = specularStrength * pow(max(dot(viewDir, reflectDir), 0.0), reflection) * lights[i].lightColor;
        }
        else {
            vec3 ref = texture(reflectionMap, UV).xyz;
            specular = specularStrength * pow(max(dot(viewDir, reflectDir), 0.0), (ref.x + ref.y + ref.z) / 3.0f * 64) * lights[i].lightColor;
        }


        float dist = length(lights[i].lightPos - Vertex);
        float attenuation = 1.0 / (linear * dist + quadratic * (dist * dist));


        result += (diffuse + specular) * attenuation;
    }


    color = vec4(ambientLight + result, 1.0f) * texture(tex, UV);
}

Я создал класс для UniformVariables, вот так это выглядит:

static GLint getLoc(GLuint program, std::string name) {
    return glGetUniformLocation(program, name.c_str());
}

UniformVar<int>::UniformVar(Shader *shader, std::string varName, int *var):
shader(shader), var(var) {
    location = getLoc(shader->getProgram(), varName);

    if(location == -1) {
        printf(PRINTF_RED);
        printf("Variable %s was not found!\n", varName.c_str());
        printf(PRINTF_DEFAULT);
        exit(1);
    }
}

void UniformVar<int>::getVar() {
    glGetUniformiv(shader->getProgram(), location, var);
}

void UniformVar<int>::setVar() {
    glUniform1i(location, *var);
}

Я называю переменные следующим образом:

reflectionUniform(shader, "reflection", &reflection)

, где reflectionUniform - это мой UniformVar, а reflection - моя переменная.

Перечисление всех однородных переменных моего шейдера дает такой результат, который выглядит неплохо:

Uniform #0 Type: 5124 Name: validObjects
Uniform #1 Type: 35678 Name: reflectionMap
Uniform #2 Type: 35665 Name: lights[0].lightColor
Uniform #3 Type: 35665 Name: lights[0].lightPos
//0 - 29
Uniform #42 Type: 35676 Name: projection
Uniform #43 Type: 35676 Name: model
Uniform #44 Type: 35678 Name: tex
Uniform #45 Type: 35676 Name: view
Uniform #46 Type: 35665 Name: viewPos
Uniform #47 Type: 5124 Name: reflection
Uniform #48 Type: 5124 Name: useReflectionMap

1 Ответ

1 голос
/ 27 января 2020

Проблема в том, что некоторые объекты использовали другие шейдеры, которые не имеют настройки освещения. Так что не было никаких реальных проблем с OpenGL.

...