更改返回 float *color 的函数中的 alpha 分量
Change alpha component in a function returning a float *color
我有一个返回 (float *) 颜色的函数。
它有效,直到我尝试更改一种颜色的 alpha 分量,现在几乎所有颜色都有 alpha 问题,即使颜色没有通过测试“if (alpha)”。
例如:
浮动 * colorTest = getColor(0); // 不要再给我好结果了,一旦之前调用了任何 getColor(1)。
float * getColor(float alpha) {
float * col;
if (val == 1)
col = colorWhite; // colorWhite is a float *
else if (val == 2)
col = colorRed;
else if (etc..)
col = colEtc;
if (alpha) {
col[3] = alpha; // this doesn't works
}
return col;
}
我也试过通过col指针改变alpha值,结果一样:
if (alpha) {
float *a;
a = (float *)(&col + 3);
*a = alpha;
}
有什么建议吗?
编辑
成功了,感谢 hyde 告诉我我正在更改我的全局颜色。 (我习惯于错误地将 float * 视为数组)
所以,我只是将结果复制到第二个变量中,然后修改这个新颜色。
float * getColor(float alpha) {
float * col;
float * tmp;
if (val == 1)
tmp = colorWhite; // colorWhite is a float *
else if (val == 2)
tmp = colorRed;
else if (etc..)
tmp = colEtc;
memcpy(col, tmp, sizeof(float)*4);
if (alpha) {
col[3] = alpha; // this now works without issue
}
return col;
}
if (alpha) {
col[3] = alpha; // this doesn't works
}
此处 col
指向您的一种全局颜色。然后你改变它。
因为颜色很小(我假设是 4 个浮点数),所以只传递值而忘记指针。通过定义 struct
来做到这一点
struct color {
float component[4];
// Or if you prefer: float r, g, b, a;
};
特别是在 64 位系统上,指针可能是这个结构的一半大小,并且有指针解引用开销,所以 performance-wise 基本相同。指针总是比值更混乱。
一旦你有了带有结构值的工作代码,那么你可以考虑使用指针来优化,例如。 const struct color *param
作为函数参数。但是,这确实是一个非常小的优化,有 4 个浮点数。如果该结构在 2 个寄存器中传递,则强制它在内存中以便您可以在 1 个寄存器中传递指针甚至可能是一种悲观。
此外,您通常不想意外更改像这些全局颜色这样的全局数据,因此将它们设为常量。
我有一个返回 (float *) 颜色的函数。 它有效,直到我尝试更改一种颜色的 alpha 分量,现在几乎所有颜色都有 alpha 问题,即使颜色没有通过测试“if (alpha)”。
例如:
浮动 * colorTest = getColor(0); // 不要再给我好结果了,一旦之前调用了任何 getColor(1)。
float * getColor(float alpha) {
float * col;
if (val == 1)
col = colorWhite; // colorWhite is a float *
else if (val == 2)
col = colorRed;
else if (etc..)
col = colEtc;
if (alpha) {
col[3] = alpha; // this doesn't works
}
return col;
}
我也试过通过col指针改变alpha值,结果一样:
if (alpha) {
float *a;
a = (float *)(&col + 3);
*a = alpha;
}
有什么建议吗?
编辑
成功了,感谢 hyde 告诉我我正在更改我的全局颜色。 (我习惯于错误地将 float * 视为数组) 所以,我只是将结果复制到第二个变量中,然后修改这个新颜色。
float * getColor(float alpha) {
float * col;
float * tmp;
if (val == 1)
tmp = colorWhite; // colorWhite is a float *
else if (val == 2)
tmp = colorRed;
else if (etc..)
tmp = colEtc;
memcpy(col, tmp, sizeof(float)*4);
if (alpha) {
col[3] = alpha; // this now works without issue
}
return col;
}
if (alpha) {
col[3] = alpha; // this doesn't works
}
此处 col
指向您的一种全局颜色。然后你改变它。
因为颜色很小(我假设是 4 个浮点数),所以只传递值而忘记指针。通过定义 struct
来做到这一点struct color {
float component[4];
// Or if you prefer: float r, g, b, a;
};
特别是在 64 位系统上,指针可能是这个结构的一半大小,并且有指针解引用开销,所以 performance-wise 基本相同。指针总是比值更混乱。
一旦你有了带有结构值的工作代码,那么你可以考虑使用指针来优化,例如。 const struct color *param
作为函数参数。但是,这确实是一个非常小的优化,有 4 个浮点数。如果该结构在 2 个寄存器中传递,则强制它在内存中以便您可以在 1 个寄存器中传递指针甚至可能是一种悲观。
此外,您通常不想意外更改像这些全局颜色这样的全局数据,因此将它们设为常量。