首页 > 解决方案 > GLSL 禁用纹理的 alpha 采样

问题描述

我正在使用 PyOpenGL 开发一个简单的应用程序。它使用 2D(正交)渲染,几乎所有对象都是单四边形,并应用了基于 RGBA 图像的纹理。为了计算准确的命中测试,我正在使用帧缓冲区中的唯一颜色渲染纹理的 Alpha 通道。除了结果图像中颜色采样的小伪影外,该方法运行良好。 在此处输入图像描述

GLSL 着色器

#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform vec4 in_color;

void main()
{
    vec4 alpha = texture(ourTexture, TexCoord).aaaa;
    FragColor = alpha*in_color;
}

帧缓冲区

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.width, self.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0)

正如您在图像中看到的,边缘(蓝色)周围的某些像素未渲染为等于着色器的in_color参数。我需要的是始终如一的颜色。在 GLSL 中

  1. 将这些蓝色像素转换为in_color。(更好的解决方案)
  2. 如果不是,则根本不渲染蓝色像素。

因为图像用于命中测试,所以即使我得到锯齿状边缘,也没关系。

标签: glslpyopengl

解决方案


推荐阅读