Я использую привязки go-gl для OpenGl.
Я определил источник для двух шейдеров следующим образом:
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"
Вершинный шейдер создается и компилируется без проблем.
Вот код, который создает и компилирует фрагментный шейдер:
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
}
Что выводит следующее (к сожалению, нет сообщения в информационном журнале):
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/unspecialized shader
Есть ли отзывы о том, как скомпилировать фрагментный шейдер?
1) Да, строки имеют разрывы строк. 2) Я вставил строку foo bar
в исходный код с тем же результатом.
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
. Кроме того, поскольку до сих пор не было никаких ошибок, информационный журнал также пуст.
1) Go автоматически вставляет разрывы строк в строки? Если нет, то ваши шейдеры представляют собой всего лишь одну строку. 2) Получаете ли вы допустимое сообщение об ошибке при добавлении синтаксической ошибки в вершинный шейдер? Например, удалите ;?