gpt4 book ai didi

c++ - 将 1d 纹理传递到片段着色器 - 全为零?

转载 作者:行者123 更新时间:2023-11-28 03:01:37 26 4
gpt4 key购买 nike

我正在尝试使用 1D 纹理将整数数组传递到片段着色器中。尽管代码编译并运行,但当我查看着色器中的纹理值时,它们都是零!

这是我在学习了一些教程后得到的 C++ 代码:

GLuint texture;
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0 + 5); // use the 5th since first 4 may be taken
glBindTexture (GL_TEXTURE_1D, texture);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RED_INTEGER, myVec.size(), 0,
GL_RED_INTEGER, GL_INT, &myVec[0]);

GLint textureLoc = glGetUniformLocation( program, "myTexture" );
glUniform1i(textureLoc, 5);

这就是我尝试访问着色器中的纹理的方式:

uniform sampler1D myTexture; 
int dat = int(texture1D(myTexture, 0.0).r); // 0.0 is just an example
if (dat == 0) { // always true!

我确定这是我的一些小错误,但我就是想不通。不幸的是,我只能使用 GLSL 1.20,所以这种语法对某些人来说可能已经过时了。

那么为什么着色器中的纹理值总是零?

编辑:

如果我用 float 替换整数,我仍然有问题:

std::vector <float> temp; 
// fill temp...
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, GL_R32F, temp.size(), 0, GL_R32F, GL_FLOAT, &temp[0]);
// ...
glUniform1f(textureLoc, 5);

这一次,仅仅从sampler 中读取似乎会弄乱其他纹理..

最佳答案

首先,GL_RED_INTEGER 的内部格式是错误的。我会改用 GL_R32I(32 位有符号整数),您也可以使用 GL_R8IGL_R16I,具体取决于您的实际存储要求 - 较小的类型一般都比较好。另外,不要对整数纹理使用 sampler1D,请使用 isampler1D

由于 OpenGL ES 在使用像素传递函数(例如 glTexture2D (...))时不支持数据类型转换,因此通常可以找到格式、内部格式和类型的最佳组合如果您查看 OpenGL ES docs,则在表格中.


你不能在 OpenGL 2.1 中使用整数纹理,如果我们回到你昨天遇到的 UBO 问题。如果您无法在 OS X 上获得核心配置文件上下文,则只能使用 GLSL 1.2 (OpenGL 2.1)。 GL_R32IGL_RED_INTEGER 等常量将被定义,但它们应该在 OS X 的 OpenGL 2.1 实现中在运行时产生 GL_INVALID_ENUM 错误。< p>

这并不是说您不能将整数值打包到标准定点纹理中并在着色器中取回整数值。如果您使用每个组件 8 位格式(例如 GL_R8),您可以存储 0 - 255 范围内的值。在你的着色器中,在你进行纹理查找后(我会使用 GL_NEAREST 作为纹理过滤器,过滤真的会搞砸)你可以将浮点结果乘以 255.0 并转换为 int。它远非完美,但多年来我们在没有整数纹理的情况下相处得很好。

这里是对你的着色器的修改,正是这样做的:

#version 120

uniform sampler1D myTexture;
int dat = (int)(texture1D (myTexture, (idx + 0.5)/(float)textureWidth).r * 255.0);
if (dat == 0) { // not always true!

假设 GL_R8 为内部格式,使用 65535.0GL_R16

关于c++ - 将 1d 纹理传递到片段着色器 - 全为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com