editor php Yuzai mendapati bahawa pelorek serpihan GLSL menghadapi masalah semasa penyusunan, tetapi tiada mesej ralat. Ini boleh menyebabkan pembangun keliru tentang masalah yang berlaku. Sebelum menyelesaikan masalah ini, perkara pertama yang perlu dijelaskan ialah tiada mesej ralat biasanya kerana pengkompil tidak menghasilkan sebarang mesej ralat, atau mesej ralat diabaikan. Seterusnya, kita perlu menyelesaikan masalah langkah demi langkah sebab yang mungkin untuk mencari penyelesaian.
Saya menggunakan binding go-gl untuk OpenGl.
Saya mentakrifkan sumber untuk kedua-dua shader seperti berikut:
<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>
Vertex shader dicipta dan disusun tanpa masalah.
Berikut ialah kod untuk mencipta dan menyusun pelorek serpihan:
<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>
Mengeluarkan yang berikut (mengecewakan, tiada mesej log maklumat):
Got failure from fragment shader: gl version: 4.6 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~23.04.1 gl vendor: Intel
Saya mencuba nilai yang berbeza dalam versi core
/compatibility
之间切换,更改 FragColor
的名称以及 vec4
.
Saya juga cuba mengulas keluar if
块并继续创建该程序。检查程序的块输出一个错误,这是预期的,因为着色器未编译: error: linking with uncompiled/unspecializedshader
Sebarang maklum balas tentang cara menyusun pelorek serpihan?
Hubungi glShaderSource()
仅设置源着色器的代码。它无法编译。之后需要单独调用glCompileShader()
. < /p>
gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.CompileShader(fragmentShader)
Sebab gl.GetShaderiv()
gl.GetShaderiv()
与gl.COMPILE_STATUS
结果 success
为 gl.FALSE
。是因为如果上次编译成功, gl.COMPILE_STATUS
只会产生 gl.TRUE
。但是,由于您从未调用过 gl.CompileShader()
,因此之前没有成功编译,因此您收到 gl.FALSE
dan gl.COMPILE_STATUS
mengakibatkan berjaya
menjadi gl.FALSE
. Ini kerana gl.COMPILE_STATUS
hanya akan menghasilkan gl.TRUE
jika kompilasi terakhir berjaya. Walau bagaimanapun, kerana anda tidak pernah memanggil gl.CompileShader()
, tiada kompilasi yang berjaya sebelum ini, jadi anda menerima gl.FALSE
. Selain itu, log maklumat kosong kerana tidak ada sebarang ralat setakat ini.
Atas ialah kandungan terperinci Pelorek serpihan GLSL gagal untuk disusun tanpa mesej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!