Hello, I’m new to shader programming, I got this code working with a raw glfw window with open gl in a simple program. However the OpenGL Context does not seem to be compiling the shader. It says there is a missing version.
If anyone knows how to fix this or what I’m doing wrong that would help…
Thank you in advance.
juce::String vertexShader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec4 position;\n"
"void main()\n"
"{\n"
" gl_Position = position;\n"
"}\n";
juce::String fragmentShader =
"#version 330 core\n"
"\n"
"layout(location = 0) out vec4 color;\n"
"void main()\n"
"{\n"
" color = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
std::unique_ptr<juce::OpenGLShaderProgram> shaderProgramAttempt = std::make_unique<juce::OpenGLShaderProgram> (context);
shaderProgramAttempt->addVertexShader (vertexShader);
shaderProgramAttempt->addFragmentShader (fragmentShader);
shaderProgramAttempt->link();
Here is the error log
data juce::CharPointer_UTF8::CharType * “ERROR: 0:1: ‘’ : version ‘330’ is not supported\nERROR: 0:1: ‘’ : syntax error: #version\nERROR: 0:3: ‘layout’ : syntax error: syntax error\n” 0x00006000039ac010
I think it has to be something like that. I do not know if Juce uses glfw3 for native windows.
In this method I get an error.
void Renderer::newOpenGLContextCreated(){
context.setOpenGLVersionRequired (juce::OpenGLContext::OpenGLVersion::openGL3_2);
}
However, if I put that code into the render function, I do not get an error, until I try and compile the shader again. I’ve tried all the different openGL function arguments aswell.
This is the code that got it working for me.
const char* vertexShader = R"(
attribute vec4 position;
void main()
{
gl_Position = position;
}
)";
const char* fragmentShader = R"(
void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red color
}
)";
std::unique_ptr<juce::OpenGLShaderProgram> shaderProgramAttempt = std::make_unique<juce::OpenGLShaderProgram> (context);
shaderProgramAttempt->addVertexShader (juce::OpenGLHelpers::translateVertexShaderToV3(vertexShader));
shaderProgramAttempt->addFragmentShader (juce::OpenGLHelpers::translateFragmentShaderToV3(fragmentShader));
shaderProgramAttempt->link();
mainShader = std::move (shaderProgramAttempt);
then attach the shader in your renderOpenGl()
void Renderer::renderOpenGL(){
using namespace juce::gl;
// Clear the color buffer
glClear(GL_COLOR_BUFFER_BIT);
mainShader->use();
glDrawArrays(GL_TRIANGLES, 0, 3);
}
1 Like