我有一個回傳 (float *) 顏色的函式。它有效,直到我嘗試更改一種顏色的 alpha 分量,現在幾乎所有顏色都有 alpha 問題,即使顏色沒有通過“if (alpha)”測驗。
例如:
float * 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;
}
有什么建議嗎?
編輯
讓它作業,謝謝海德,他告訴我我正在改變我的全域顏色。(我習慣于錯誤地將 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;
}
uj5u.com熱心網友回復:
if (alpha) {
col[3] = alpha; // this doesn't works
}
這里col指向您的全域顏色之一。然后你改變它。
由于顏色很小(我假設為 4 個浮點數),只需傳遞值并忘記指標。通過定義結構來做到這一點
struct color {
float component[4];
// Or if you prefer: float r, g, b, a;
};
尤其是在 64 位系統上,指標可能是這個結構體大小的一半,并且具有指標解參考開銷,因此在性能方面基本相同。并且指標總是比值更混亂。
一旦你有結構值的作業代碼,那么你可以考慮使用指標來優化,例如。const struct color *param作為函式引數。但是,這確實是一個非常小的優化,只有 4 個浮點數。如果該結構在 2 個暫存器中傳遞,那么強制它在記憶體中以便您可以在 1 個暫存器中傳遞一個指標甚至可能是一種悲觀。
此外,您通常不想像這些全域顏色一樣意外更改全域資料,因此請將它們設為 const。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430730.html
