php小編魚仔發現,GLSL 片段著色器在編譯時遇到問題,卻沒有任何錯誤訊息。這可能讓開發者感到困惑,不知道出了什麼問題。在解決這個問題之前,首先要明確的是,沒有錯誤訊息通常是因為編譯器沒有產生任何錯誤訊息,或者錯誤訊息被忽略了。接下來,我們需要逐步檢視可能的原因,以找到解決方法。
我正在使用 OpenGl 的 go-gl 綁定。
我定義了兩個著色器的來源,如下所示:
<code>const vertexShaderSource = `#version 460 compatibility layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); }` + "\x00" const fragmentShaderSource = `#version 460 compatibility out vec4 FragColor; void main() { FragColor = vec4(0.5f, 0.1f, 0.1f, 1.0f); }` + "\x00" </code>
頂點著色器的建立和編譯都沒有問題。
以下是建立和編譯片段著色器的程式碼:
<code>fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER) fragmentShaderSourceC := gl.Str(fragmentShaderSource) gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &success) if success != gl.TRUE { var length int32 infoLogC := [LOGSIZE]uint8{} gl.GetShaderInfoLog(fragmentShader, LOGSIZE, &length, &infoLogC[0]) infoLog := gl.GoStr(&infoLogC[0]) fmt.Printf("Got failure from fragment shader: %s\n", infoLog) fmt.Printf("gl version: %s\n", gl.GoStr(gl.GetString(gl.VERSION))) fmt.Printf("gl vendor: %s\n", gl.GoStr(gl.GetString(gl.VENDOR))) return } </code>
輸出以下內容(令人沮喪的是,沒有資訊日誌訊息):
Got failure from fragment shader: gl version: 4.6 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~23.04.1 gl vendor: Intel
我嘗試在版本 core
/compatibility
之間切換,更改 FragColor
的名稱以及 vec4
中的不同值。
我還嘗試註解掉 if
區塊並繼續建立該程式。檢查程式的區塊輸出一個錯誤,這是預期的,因為著色器未編譯: error: linking with uncompiled/unspecializedshader
#有關如何編譯片段著色器的任何回饋嗎?
呼叫 glShaderSource()
# 僅設定來源著色器的程式碼。它無法編譯。之後需要單獨呼叫glCompileShader()
#。
gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.CompileShader(fragmentShader)
原因 gl.GetShaderiv()
與gl.COMPILE_STATUS
結果 success
為 gl.FALSE
。是因為如果上次編譯成功, gl.COMPILE_STATUS
只會產生 gl.TRUE
。但是,由於您從未呼叫過 gl.CompileShader()
,因此之前沒有成功編譯,因此您收到 gl.FALSE
。此外,由於到目前為止還沒有任何錯誤,因此資訊日誌也是空的。
以上是GLSL 片段著色器無法編譯且沒有任何訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!