Преобразование glsl от 150 до 120

У меня есть несколько примеров, которые я хочу запустить на своем ПК. Проблема в том, что они написаны с помощью glsl target 150, а мой компьютер поддерживает только версию 120. Я уверен, что сама программа достаточно проста, чтобы не требовать каких-либо расширенных функций OpenGL 3.1. Я нашел некоторую информацию о том, какие шаги следует предпринять для преобразования glsl (например, изменение в атрибут, вне зависимости от его изменения), но оно все еще не компилируется (действительно ли возможно каким-то образом получить из этого значимое сообщение об ошибке?).

оригинал .vert

#version 150
in vec2 in_Position;
in vec3 in_Color;
out vec3 ex_Color;
void main(void) {
 gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
 ex_Color = in_Color;
}

оригинал .frag

#version 150
precision highp float;
in vec3 ex_Color;
out vec4 gl_FragColor;
void main(void) {
 gl_FragColor = vec4(ex_Color,1.0);
}

изменено .vert

#version 120 
attribute vec2 in_Position; 
attribute vec3 in_Color; 
varying vec3 ex_Color; 
void main(void) { 
 gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0); 
 ex_Color = in_Color; 
}

изменено .frag

#version 120 
precision highp float; 
attribute vec3 ex_Color; 
void main(void) { 
 gl_FragColor = vec4(ex_Color,1.0); 
}

Так может ли кто-нибудь обнаружить проблему здесь?

3 ответа

Чтобы получить сообщения об ошибке компиляции/ссылки, вам необходимо использовать команды glGetShaderInfoLog для шейдеров и glGetProgramInfoLog для программ.

Они расскажут вам, каковы ваши конкретные ошибки.

Просто принимая удар по ошибке, вы объявляете ввод attribute в шейдере фрагмента, который, я считаю, должен быть varying. Атрибуты предназначены для data- > vertex shader, а переменные для шейдерного шейдера → шейдера фрагмента.

В спецификации glsl 120 также упоминается, что определитель точности "зарезервирован для будущего использования", поэтому он не может быть применим к версии 120. Возможно, вы можете отказаться от него.

Но вы все равно должны быть знакомы с функциями infolog независимо от того, вам обязательно понадобится их в конце концов.


Вы можете получить ошибки компиляции, извлекая "информационный журнал":

****** nVertexShader, nPixelShader; // handles to objects
GLint vertCompiled, fragCompiled; // status values
GLint linked;
glCompileShader(nVertexShader);
glGetShaderiv(nVertexShader, GL_COMPILE_STATUS, &vertCompiled);

если vertCompiled (или fragCompile) == 0, сделайте это, чтобы понять, почему:

int infologLength = 0;
int charsWritten = 0;
glGetShaderiv(nVertexShader, GL_INFO_LOG_LENGTH, &infologLength);
if (infologLength > 0)
{
 GLchar* infoLog = (GLchar *)malloc(infologLength);
 if (infoLog == NULL)
 {
 printf( "ERROR: Could not allocate InfoLog buffer");
 exit(1);
 }
 glGetShaderInfoLog(nVertexShader, infologLength, &charsWritten, infoLog);
 printf( "Shader InfoLog:\n%s", infoLog );
 free(infoLog);
}

Вы можете сделать то же самое со ссылкой, просто установите для ссылки == 0 и получите журнал, как указано выше:

glLinkProgram(m_nProgram);
glGetProgramiv(m_nProgram, GL_LINK_STATUS, &linked);


precision highp float;

Это не является законным в GLSL 1.20. Я даже не знаю, почему он был помещен в шейдер 1.50, так как спецификаторы точности полезны только в GLSL ES, и вы не можете делиться 1,50 шейдерами с GLSL ES.

licensed under cc by-sa 3.0 with attribution.