Opengl 如何避开彩色条纹
这里是从每个通道32位浮点到每个通道“无符号字节”颜色规范化的转换,以节省一些pci express带宽用于其他用途。有时会出现条纹,看起来不自然 我怎样才能避免这种情况?尤其是在球体的边缘 浮动颜色通道: 无符号字节通道: 在这里,蓝色球体上的黄色边缘和红色球体上的蓝色边缘不应该存在 我使用的规范化(来自opencl内核): 绑定到缓冲区:Opengl 如何避开彩色条纹,opengl,rgba,Opengl,Rgba,这里是从每个通道32位浮点到每个通道“无符号字节”颜色规范化的转换,以节省一些pci express带宽用于其他用途。有时会出现条纹,看起来不自然 我怎样才能避免这种情况?尤其是在球体的边缘 浮动颜色通道: 无符号字节通道: 在这里,蓝色球体上的黄色边缘和红色球体上的蓝色边缘不应该存在 我使用的规范化(来自opencl内核): 绑定到缓冲区: GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); GL15.glBindBuffer(GL15.GL_
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.0,1.0]范围的浮点值,该范围乘以255.0并强制转换为
无符号字符后产生溢出。您遇到的假着色发生在场景中一个或多个颜色组件异常明亮的区域
似乎您知道在编写rgb0>255?255:rgb0
时会出现此溢出,但该逻辑将不起作用,因为当无符号字符
溢出时,它会返回到0而不是大于255的数字
对此的最小解决方案是将浮点颜色钳制在[0.0,1.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);