Thanks very much so far. Excuse my tediousness.
The shaders are stored in strings:
const char* gl_vertex_shader_code =
"#version 330 core
"
"
"
"layout(location = 0) in vec3 Position;
"
"layout(location = 1) in vec2 TexCoord;
"
"out vec2 oTexCoord;
"
"
"
"void main()
"
"{
"
" gl_Position = vec4(Position, 1);
"
" oTexCoord = TexCoord;
"
"};
";
const char* gl_fragment_shader_code =
"#version 330
"
"
"
"uniform vec2 LensCenter;
"
"uniform vec2 ScreenCenter;
"
"uniform vec2 Scale;
"
"uniform vec2 ScaleIn;
"
"uniform vec4 HmdWarpParam;
"
"uniform sampler2D texture0;
"
"varying vec2 oTexCoord;
"
"out vec4 outcolor;
"
"
"
"vec2 HmdWarp(vec2 in01)
"
"{
"
" vec2 theta = (in01 - LensCenter) * ScaleIn; // Scales to [-1, 1]
"
" float rSq = theta.x * theta.x + theta.y * theta.y;
"
" vec2 theta1 = theta * (HmdWarpParam.x + HmdWarpParam.y * rSq +
"
" HmdWarpParam.z * rSq * rSq + HmdWarpParam.w * rSq * rSq * rSq);
"
" return LensCenter + Scale * theta1;
"
"}
"
"void main()
"
"{
"
" vec2 tc = HmdWarp(oTexCoord);
"
" if (!all(equal(clamp(tc, ScreenCenter-vec2(0.25,0.5), ScreenCenter+vec2(0.25,0.5)), tc)))
"
" outcolor = vec4(0);
"
" else
"
" outcolor = texture2D(texture0, tc);
"
"};
";
An example for the uniform functions (the other ones work just the same) is:
void MainWindow::gl_uniform_1i(const char* varname, int value)
{
GLuint varid = glGetUniformLocation(gl_fragment_shader_program, varname); // Error is caused here
glUniform1i(varid, value);
}
Shaders are compiled etc. in
qDebug() <<" Compiling Vertex Shader";
glShaderSource(VertexShaderID, 1, &gl_vertex_shader_code , NULL);
glCompileShader(VertexShaderID);
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
// printf("%s", &VertexShaderErrorMessage[0]);
qDebug() << &VertexShaderErrorMessage[0];
}
// Compile Fragment Shader
qDebug() << "Compiling fragment shader";
glShaderSource(FragmentShaderID, 1, &gl_fragment_shader_code , NULL);
glCompileShader(FragmentShaderID);
// Check Fragment Shader
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
// printf("%s", &FragmentShaderErrorMessage[0]);
qDebug() << &FragmentShaderErrorMessage[0];
}
// Link the program
qDebug() << "Linking program";
gl_fragment_shader_program = glCreateProgram();
glAttachShader(gl_fragment_shader_program, VertexShaderID);
glAttachShader(gl_fragment_shader_program, FragmentShaderID);
glLinkProgram(gl_fragment_shader_program);
// Check the program
glGetProgramiv(gl_fragment_shader_program, GL_LINK_STATUS, &Result);
glGetProgramiv(gl_fragment_shader_program, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> ProgramErrorMessage(InfoLogLength+1);
glGetProgramInfoLog(gl_fragment_shader_program, InfoLogLength, NULL, &ProgramErrorMessage[0]);
qDebug() << &ProgramErrorMessage[0];
}
And the qDebug() calls (like cout, I think, in case you’re not familiar) give:
Compiling Vertex Shader
Vertex shader was successfully compiled to run on hardware.
Compiling fragment shader
Fragment shader was successfully compiled to run on hardware.
Linking program
Vertex shader(s) linked, fragment shader(s) linked.
Also, the glGetUniformLocation returns a huge number (4294967295 for example), but I don’t think that’s a problem. I’m just curious why it doesn’t return -1, since it’s causing an error.