TextureProj в GLSL дает нан и инф

следующий сценарий:

я создаю текстуру OpenGL и кадровый буфер и связанные объекты

GLuint frameBuffer = 0, colorBuffer, depthBuffer;

glGenFramebuffers(1, &frameBuffer);

int maskRenderingWidth = 1 * settings.width, maskRenderingHeight = 1 * settings.height;

//define texture
glUseProgram(screenMaskRenderingProgramId);
GLuint texture;
glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, maskRenderingWidth, maskRenderingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glPixelStorei(GL_PACK_ALIGNMENT, 1);glUseProgram(offscreeenMaskRenderingProgramId);

//setup framebuffer stuff
glGenRenderbuffers(1, &colorBuffer);
glGenRenderbuffers(1, &depthBuffer);

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, maskRenderingWidth, maskRenderingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, maskRenderingWidth, maskRenderingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);

Затем я рендерил полигон в тот кадровый буфер, который я помещаю в текстуру. После этого я рисую еще один многоугольник, но на этот раз в буфер экрана. Наконец, я расправляю квад по всему экрану и передаю ему координаты uv (0,0), (0,1), (1,1) и (1,0) и ранее созданную текстуру.

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(textureLocation,0);

Чего я хочу достичь, так это того, что если у этой текстуры в некоторых координатах текстуры есть определенные значения, я хочу нарисовать соответствующие значения текстуры, в противном случае я хочу, чтобы выходные данные по координатам (u, v) были
нетронутым.

if(textureProj(mask, uv_coords).a == 1) {
gl_FragColor = textureProj(mask, uv_coords);
}

После некоторых попыток я понял, что всегда все из текстуры нарисовано. Кажется, моя текстура повреждена, так как isinf и isnan возвращают true для textureProj (mask, uv_coords) для каждого uv_coord. Как это могло быть возможно, и у кого-то есть идея, что может быть сломано здесь?

in vec4 uv_coords;
uniform sampler2D mask;
void main() {
vec4 c = textureProj(mask, uv_coords);
bvec4 inf = isinf(c);
if(inf.r == true && inf.g == true && inf.b == true && inf.a == true) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
});

Это дает полностью белый экран. То же самое относится и к

inf = isnan(c)

У кого-нибудь есть идея, что здесь происходит?

РЕДАКТИРОВАТЬ:

Я забыл упомянуть, что если я пропущу условие if в фрагментном шейдере и просто сделаю

in vec4 uv_coords;
uniform sampler2D mask;
void main() {
vec4 c = textureProj(mask, uv_coords);
gl_FragColor = c;   });

текстура нарисована правильно. Делает это еще более странным.

EDIT2:

хорошо я читать что не установка gl_FragColor дает неопределенное поведение. поэтому мой подход заключается в том, чтобы загрузить две текстуры в этот конкретный фрагментный шейдер и визуализировать все за один проход

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]