Compiling Shaders

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

Could it be this?

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