如何避开彩色条纹
How to evade color stripes
这里是从每通道 32 位浮点数到每通道颜色标准化 "unsigned byte" 的转换,以节省一些 pci-express 带宽用于其他事情。有时会有颜色条纹,看起来不自然。
我怎样才能避免这种情况?尤其是在球体的边缘。
浮动颜色通道:
无符号字节通道:
这里,蓝球上的黄边和红球上的蓝边不应该存在。
我使用的规范化(来自 opencl 内核):
// multiplying with r doesnt help as picture color gets too bright and reddish.
float r=rsqrt(pixel0.x*pixel0.x+pixel0.y*pixel0.y+pixel0.z*pixel0.z+0.001f);
unsigned char rgb0=(unsigned char)(pixel0.x*255.0);
unsigned char rgb1=(unsigned char)(pixel0.y*255.0);
unsigned char rgb2=(unsigned char)(pixel0.z*255.0);
rgba_byte[i*4+0]=rgb0>255?255:rgb0;
rgba_byte[i*4+1]=rgb1>255?255:rgb1;
rgba_byte[i*4+2]=rgb2>255?255:rgb2;
rgba_byte[i*4+3]=255;
绑定到缓冲区:
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 并转换为 unsigned char
会产生溢出。您遇到的错误着色发生在场景中一种或多种颜色成分异常明亮的区域。
当您写 rgb0>255?255:rgb0
时,您似乎知道会发生这种溢出,但该逻辑将不起作用,因为当 unsigned char
溢出时,它会回绕到 0 而不是大于 255.
的数字
对此的最小解决方案是将浮点颜色限制在 [0.0、1.0] 范围内
在转换为定点 0.8(8 位无符号归一化)颜色之前,避免溢出。
但是,如果这是一个常见问题,您最好实施从 HDR 到 LDR post 的流程。您将识别场景中某些区域(或所有区域)中最亮的像素,然后将所有颜色归一化到该范围内。您最初是在实现这一点(使用 r = sqrt (...)
),但它仅使用当前像素的大小来标准化颜色。
这里是从每通道 32 位浮点数到每通道颜色标准化 "unsigned byte" 的转换,以节省一些 pci-express 带宽用于其他事情。有时会有颜色条纹,看起来不自然。
我怎样才能避免这种情况?尤其是在球体的边缘。
浮动颜色通道:
无符号字节通道:
这里,蓝球上的黄边和红球上的蓝边不应该存在。
我使用的规范化(来自 opencl 内核):
// multiplying with r doesnt help as picture color gets too bright and reddish.
float r=rsqrt(pixel0.x*pixel0.x+pixel0.y*pixel0.y+pixel0.z*pixel0.z+0.001f);
unsigned char rgb0=(unsigned char)(pixel0.x*255.0);
unsigned char rgb1=(unsigned char)(pixel0.y*255.0);
unsigned char rgb2=(unsigned char)(pixel0.z*255.0);
rgba_byte[i*4+0]=rgb0>255?255:rgb0;
rgba_byte[i*4+1]=rgb1>255?255:rgb1;
rgba_byte[i*4+2]=rgb2>255?255:rgb2;
rgba_byte[i*4+3]=255;
绑定到缓冲区:
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 并转换为 unsigned char
会产生溢出。您遇到的错误着色发生在场景中一种或多种颜色成分异常明亮的区域。
当您写 rgb0>255?255:rgb0
时,您似乎知道会发生这种溢出,但该逻辑将不起作用,因为当 unsigned char
溢出时,它会回绕到 0 而不是大于 255.
对此的最小解决方案是将浮点颜色限制在 [0.0、1.0] 范围内 在转换为定点 0.8(8 位无符号归一化)颜色之前,避免溢出。
但是,如果这是一个常见问题,您最好实施从 HDR 到 LDR post 的流程。您将识别场景中某些区域(或所有区域)中最亮的像素,然后将所有颜色归一化到该范围内。您最初是在实现这一点(使用 r = sqrt (...)
),但它仅使用当前像素的大小来标准化颜色。