【问题标题】:Sampling unsigned integer texture data in a shader在着色器中采样无符号整数纹理数据
【发布时间】:2014-04-21 21:24:22
【问题描述】:

我想使用以下代码通过片段着色器渲染一个无符号整数纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data);

以及部分片段着色器代码:

#version 330
uniform usampler2D tex;
void main(void){
    vec3 vec_tex;
    vec_tex = (texture(tex), TexCoordOut).r
}

OpenGL 编程指南中写到,如果我想在着色器中接收整数,那么我应该使用整数采样器类型,整数内部格式,以及整数外部格式和类型。这是我们GL_R8UI 作为内部格式,GL_RED_INTEGER 作为外部格式,GL_UNSIGNED_BYTE 作为数据类型。我还在着色器中使用usampler2D。但是当程序开始渲染文件时,总是得到错误implicit cast from "int" to "uint"。似乎纹理数据存储为 int,无符号采样器无法转换它。但我确实使用GL_R8UI 作为内部格式,所以纹理数据应该存储为无符号。为什么未签名的采样器只得到签名的整数?我该如何解决这个问题?

【问题讨论】:

  • 你知道vec3 是浮点数,对吧?如果您想存储从usampler2D 获取的结果,您可能应该使用uvec3。即使这样,如果这确实是您的着色器,它应该会产生比这更严重的错误。 texture (...) 需要纹理坐标,TexCoordOut 甚至没有定义。

标签: opengl textures shader unsigned-integer


【解决方案1】:

纹理函数调用不正确,其次纹理函数返回浮点值,需要在着色器中通过将 RGBA 分量除以 255.0(如您使用 GL_R8UI)并返回和片段颜色输出来处理。

uniform usampler2D tex;
out uvec3 OutColor;
void main(void){
    uvec3 vec_tex;
    vec_tex = texture(tex, TexCoordOut)
    OutColor = vec3(float(vec_tex.r)/255, float(vec_tex.g)/255, float(vec_tex.b)/255)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多