該着色器程序在Radeon 3450M,GT 550Ti,GT430等上運行正常,但在Intel HD4000上運行失敗。任何想法可能是錯誤的,或建議使着色器更友好?GLSL着色器程序無法在Intel HD4000上運行
頂點着色器:
uniform mat4 uniform_Projection;
attribute vec4 attribute_Position;
attribute vec4 attribute_Color;
varying vec4 varying_Color;
vec4 varying_Color_Bak;
void main(void)
{
varying_Color.x = clamp(abs((attribute_Position.x + 3.0f)/5.0f), 0.1f, 1.0f);
varying_Color.y = clamp(abs((attribute_Position.y + 3.0f)/5.0f), 0.1f, 1.0f);
varying_Color.z = 0.0f;//clamp(abs((attribute_Position.x + attribute_Position.y + 4.0f)/7.0f), 0.1f, 1.0f);
varying_Color.w = 0.9f;
gl_Position = uniform_Projection * attribute_Position;
}
片段着色器:
uniform mat4 uniform_Projection;
varying vec4 varying_Color;
vec4 varying_Color_Bak;
void main (void)
{
varying_Color_Bak = varying_Color;
varying_Color = uniform_Projection * varying_Color;
for (int i = 0; i < 3; i++) {
varying_Color = sin(varying_Color);
varying_Color = inversesqrt(abs(varying_Color));
varying_Color = abs(log(varying_Color));
}
varying_Color = clamp(varying_Color, 0.1f, 1.0f);
varying_Color = mix(varying_Color, varying_Color_Bak, 0.9f);
gl_FragColor = sin(varying_Color);
}
如果你在'glGetProgramInfoLog(...)','glGetShaderInfoLog(...)'等等的輸出中包含任何錯誤代碼,它將會有所幫助。它可能就像着色器編譯器在'f'上窒息一樣簡單,後綴,因爲直到最近單精度浮點纔是唯一的精度,'f'實際上在一些stupider GLSL編譯器中產生了解析錯誤。您正在處理GLSL 130之前的語法,所以我必須假設您的目標是一個非常古老的GLSL編譯器 - 您也可以剝去精度後綴以實現可移植性。 –
謝謝,我將一些日誌記錄添加到了我的應用程序的下一個版本中,但我想確保在發佈下一個版本之前,我已經避免了最明顯的可移植性問題。我會嘗試刪除'f'後綴。 – Ags1
@ Ags1:理想情況下不應該有任何問題。按照GLSL規範添加後綴是完全有效的。如果GLSL編譯器對此抱怨,應考慮向英特爾提交錯誤報告以幫助改進其驅動程序。我不同意Andon的看法,你可能使用的是舊編譯器,因爲Ivy Bridge CPU需要最新的驅動程序才能運行,因此會帶來相當新的GLSL編譯器。另外,我不知道在Sandy Bridge CPU上有這樣的事情 - 至少在Linux上。 – thokra