Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何避开彩色条纹_Opengl_Rgba - Fatal编程技术网

Opengl 如何避开彩色条纹

Opengl 如何避开彩色条纹,opengl,rgba,Opengl,Rgba,这里是从每个通道32位浮点到每个通道“无符号字节”颜色规范化的转换,以节省一些pci express带宽用于其他用途。有时会出现条纹,看起来不自然 我怎样才能避免这种情况?尤其是在球体的边缘 浮动颜色通道: 无符号字节通道: 在这里,蓝色球体上的黄色边缘和红色球体上的蓝色边缘不应该存在 我使用的规范化(来自opencl内核): 绑定到缓冲区: GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); GL15.glBindBuffer(GL15.GL_

这里是从每个通道32位浮点到每个通道“无符号字节”颜色规范化的转换,以节省一些pci express带宽用于其他用途。有时会出现条纹,看起来不自然

我怎样才能避免这种情况?尤其是在球体的边缘

浮动颜色通道:

无符号字节通道:

在这里,蓝色球体上的黄色边缘和红色球体上的蓝色边缘不应该存在

我使用的规范化(来自opencl内核):

绑定到缓冲区:

 GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id);
 GL11.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 4, 0);  
在java环境中使用lwjgl(glfw上下文)

正如Andon M.所说,我在施法前夹紧(当我睡得很沉的时候我看不见),问题就解决了

顺便说一下,颜色质量不是很好,但使用较小的颜色缓冲区有助于提高性能


原始数据集包含超出规范化[0.01.0]范围的浮点值,该范围乘以255.0并强制转换为
无符号字符后产生溢出。您遇到的假着色发生在场景中一个或多个颜色组件异常明亮的区域

似乎您知道在编写
rgb0>255?255:rgb0
时会出现此溢出,但该逻辑将不起作用,因为当
无符号字符
溢出时,它会返回到0而不是大于255的数字

对此的最小解决方案是将浮点颜色钳制在[0.01.0]范围内 在转换为定点0.8(8位无符号标准化)颜色之前,避免溢出


然而,如果这是一个经常出现的问题,那么最好实现一个HDR到LDR后处理。您可以识别场景某个区域(或全部)中最亮的像素,然后将所有颜色规格化到该范围。您一开始就实现了这一点(使用
r=sqrt(…)
),但它只是使用当前像素的大小来规范化颜色。

这种规范化发生在哪里?Java没有
unsigned
数据类型,GLSL和Java都不知道
char
是什么。输出来自opencl上下文。使用字节数组来接收它们,但二进制表示法不一样吗?因为我在发送到gl@AndonM.Coleman之前不接触它,java有一个字符,虽然它是一个16位的值。在离散化或使用抖动之前添加少量噪声。如果将每个组件乘以相同的值(
r
),听起来有些可疑它将RGB颜色移向红色。就像你没有正确处理溢出一样。我认为在转换为
无符号字符之前,您可能需要将最大值钳制为255.0。这应该通过将
pixel0.xyz
夹紧到[0.0,1.0]来轻松实现。顺便说一句,检查
无符号字符
的值是否大于255没有多大意义。
 GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, id);
 GL11.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 4, 0);