OpenGL, фрагментный шейдер GLSL не может прочитать текстуру Sampler2D - PullRequest
0 голосов
/ 20 февраля 2019

В настоящее время я использую OpenGL для своего проекта и пытаюсь отправить данные текстуры в sampler2D.

Я хочу прочитать текстуру во фрагментном шейдере как маску, но когда я получаю свое значение пикселя, используя texelFetch, я могу получить только vec4(0, 0, 0, 1).

Вот мой код.

В моей инициализации:

#pragma region mask_creation

glActiveTexture(GL_TEXTURE0);
GLuint mask_texture;
glGenTextures(1, &mask_texture);
glBindTexture(GL_TEXTURE_2D, mask_texture);

constexpr auto channel = 4;
constexpr size_t size = width * height * channel;
auto texture_data =  new float[size];

for (auto i = 0; i < size; ++i) {
    texture_data[i] = 0.7f;
}

glTexSubImage2D(GL_TEXTURE_2D,
    0, 
    0, 0, 
    width, height,
    GL_RGBA, 
    GL_FLOAT, 
    texture_data);

delete[] texture_data;

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

GLuint mask_ID = glGetUniformLocation(programID, "mask");

При рендеринге (который находится в while(true)loop):

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, mask_texture);
glUniform1i(mask_ID, 0);

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

bool is_masked = (mask_val.x > 0.5) && (mask_val.y > 0.5) && (mask_val.z > 0.5);
if (original_depth < depth_threshold) {
    vec3 N = normalize(fs_in.N);
    vec3 L = normalize(fs_in.L);
    vec3 V = normalize(fs_in.V);

    vec3 R = reflect(-L, N);

    vec3 diffuse = max(dot(N, L), 0.0) * diffuse_albedo;
    vec3 specular = pow(max(dot(R, V), 0.0), specular_power) * specular_albedo;

    color = vec4(diffuse + specular, 1.0);
}
else {
    if (is_masked) {
        color = vec4(0, 0, 0, 1);
    }
    else {
        vec3 N = normalize(fs_in.N);
        vec3 L = normalize(fs_in.L);
        vec3 V = normalize(fs_in.V);

        vec3 R = reflect(-L, N);

        vec3 diffuse = max(dot(N, L), 0.0) * diffuse_albedo;
        vec3 specular = pow(max(dot(R, V), 0.0), specular_power) * specular_albedo;

        color = vec4(diffuse + specular, 1.0);
    }
}

Я предполагаю, что текстура не была отправлена ​​фрагментному шейдеру, и когда я проверяю ..

vec4 mask_val = texelFetch(mask, ivec2(gl_FragCoord.xy), 0);

if (mask_val.x == 0 && mask_val.y == 0 && mask_val.z == 0 && mask_val.w == 1) {
    color = vec4(1, 1, 1, 1);
}

Я получаю белый круг (который моё моделирование представляет собой сферу).

1 Ответ

0 голосов
/ 20 февраля 2019

Хранилище данных текстуры изображения не определено.Чтобы определить двухмерное текстурное изображение, вы должны вызвать glTexImage2D.
glTexSubImage2D, чтобы инициализировать данные только в области текстурного изображения.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, texture_data);

Обратите внимание, glTexImage2D также указывает внутренний формат данных текстуры.Например, можно использовать размерный внутренний формат (третий параметр), например GL_RGBA8 или GL_RGBA32F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...