Pelorek serpihan GLSL gagal untuk disusun tanpa mesej

PHPz
Lepaskan: 2024-02-14 12:18:09
ke hadapan
544 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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(). < /p>

gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil)
gl.CompileShader(fragmentShader)
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan