Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pelorek serpihan GLSL gagal untuk disusun tanpa mesej

Pelorek serpihan GLSL gagal untuk disusun tanpa mesej

PHPz
PHPzke hadapan
2024-02-14 12:18:09493semak imbas

GLSL 片段着色器无法编译且没有任何消息

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.

Kandungan soalan

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?

Penyelesaian

Hubungi glShaderSource() 仅设置源着色器的代码。它无法编译。之后需要单独调用glCompileShader().

gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil)
gl.CompileShader(fragmentShader)

Sebab gl.GetShaderiv()gl.GetShaderiv()gl.COMPILE_STATUS 结果 successgl.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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam