Фрагментный шейдер GLSL не компилируется без сообщения

Я использую привязки 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) Go автоматически вставляет разрывы строк в строки? Если нет, то ваши шейдеры представляют собой всего лишь одну строку. 2) Получаете ли вы допустимое сообщение об ошибке при добавлении синтаксической ошибки в вершинный шейдер? Например, удалите ;?

BDL 07.10.2023 18:28

1) Да, строки имеют разрывы строк. 2) Я вставил строку foo bar в исходный код с тем же результатом.

stromsy 07.10.2023 18:51
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов 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. Кроме того, поскольку до сих пор не было никаких ошибок, информационный журнал также пуст.

Другие вопросы по теме