Преобразование GLSL #130 сегмента в #330
У меня есть следующий фрагмент кода шейдера, который прекрасно работает с GLSL #130, но я хотел бы преобразовать его в код, который работает с версией #330 (поскольку версия # 130 почему-то не работает на моей машине с Ubuntu с Geforce 210 шейдер ничего не делает). После нескольких неудачных попыток (я продолжаю получать неописанные ошибки в ссылках), я решил обратиться за помощью. Приведенный ниже код динамически изменяет контраст и яркость текстуры с помощью равномерных переменных Яркость и Контрастность. Я реализовал это в Python, используя PyOpenGL:
def createShader():
"""
Compile a shader that adjusts contrast and brightness of active texture
Returns
OpenGL.shader - reference to shader
dict - reference to variables that can be passed to the shader
"""
fragmentShader = shaders.compileShader("""#version 130
uniform sampler2D Texture;
uniform float Brightness;
uniform float Contrast;
uniform vec4 AverageLuminance;
void main(void)
{
vec4 texColour = texture2D(Texture, gl_TexCoord[0].st);
gl_FragColor = mix(texColour * Brightness,
mix(AverageLuminance, texColour, Contrast), 0.5);
}
""", GL_FRAGMENT_SHADER)
shader = shaders.compileProgram(fragmentShader)
uniform_locations = {
'Brightness': glGetUniformLocation( shader, 'Brightness' ),
'Contrast': glGetUniformLocation( shader, 'Contrast' ),
'AverageLuminance': glGetUniformLocation( shader, 'AverageLuminance' ),
'Texture': glGetUniformLocation( shader, 'Texture' )
}
return shader, uniform_locations
Я посмотрел изменения, которые необходимо внести в новую версию GLSL, и попытался изменить код фрагментирующего шейдера на следующий, но затем получил только неописательные ошибки Link:
fragmentShader = shaders.compileShader("""#version 330
uniform sampler2D Texture;
uniform float Brightness;
uniform float Contrast;
uniform vec4 AverageLuminance;
in vec2 TexCoord;
out vec4 FragColor;
void main(void)
{
vec4 texColour = texture2D(Texture, TexCoord);
FragColor = mix(texColour * Brightness,
mix(AverageLuminance, texColour, Contrast), 0.5);
}
""", GL_FRAGMENT_SHADER)
Есть ли кто-нибудь, кто может помочь мне с этим преобразованием?
1 ответ
Я сомневаюсь, что повышение профиля версии шейдера решит любую проблему. #version 330 - это OpenGL-3.3, и, согласно веб-сайту продукта NVidia, максимальная версия OpenGL, поддерживаемая GeForce 210, - это OpenGL-3.1, то есть #version 140
Я не создал вершинный шейдер, потому что я не думал, что он мне нужен (я бы не знал, что я должен сделать, чтобы он делал). Раньше он работал без каких-либо вершинных шейдеров.
Вероятно, только до тех пор, пока вы не использовали фрагментный шейдер или до того, как пытались использовать текстуру. Фрагментному шейдеру нужны входные переменные, поступающие из вершинного шейдера, чтобы иметь что-то, что он может использовать в качестве координат текстуры. TexCoord
не является встроенной переменной (и в более высоких версиях GLSL все встроенные переменные, подходящие для работы, были удалены), поэтому вам необходимо заполнить ее значением (и смыслом) в вершинном шейдере.
glGetString(GL_VERSION) на машине NVidia считывает версию OpenGL 3.3.0. Это Ubuntu, так что, возможно, он отличается от спецификаций Windows?
У вас установлены проприетарные драйверы NVidia? И они на самом деле используются? Проверьте с glxinfo или glGetString(GL_RENDERER)
, OpenGL-3.3 не слишком далек от OpenGL-3.1, и теоретически основные версии OpenGL соответствуют аппаратным возможностям.