我在我的代码(使用OpenGL的c代码)中使用浮点数来操作颜色,但我使用的图形是RGB字节格式。加载以下代码后,一切都能正常工作:
//... glfw window initialization...
for (int y = 0; y < 32; y++)
{
for (int x = 0; x < 32; x++)
{
int p = (y * 32 + x) * 3;
float r = rgb[p];
float g = rgb[p + 1];
float b = rgb[p + 2];
glColor3ub(r, g, b);
glPointSize(16);
glBegin(GL_POINTS);
glVertex2i(x * 16, y * 16);
glEnd();
}
}
结果是:
如果我尝试使用以下代码对字节(逐个)进行标准化,则会出现错误:
//... glfw window initialization...
for (int y = 0; y < 32; y++)
{
for (int x = 0; x < 32; x++)
{
int p = (y * 32 + x) * 3;
float r = ((float)rgb[p]) / 255.0f;
float g = ((float)rgb[p + 1]) / 255.0f;
float b = ((float)rgb[p + 2]) / 255.0f;
glColor3f(r,g, b);
glPointSize(16);
glBegin(GL_POINTS);
glVertex2i(x * 16, y * 16);
glEnd();
}
}
通过这种方式加载的图片有不同的颜色:
1条答案
按热度按时间tjrkku2a1#
假设数组
rbg[]
为signed
,并考虑红色分量值255
。在第一个示例中,
255
实际上是-1
,并被转换为-1.000000
,然后在转换为类型GLubyte
(无符号8位)后将其传递给函数。转换规则将使此值为255
,这就是您认为您拥有的值。在第二个示例中,
255
再次转换为-1.000000
,并调整为-0.003922
,而不是预期的1.000000
,因此结果与您预期的大不相同。解决方案是将阵列定义为
unsigned char
或uint8_t
。