<tfoot id='y4BjA'></tfoot>

      <small id='y4BjA'></small><noframes id='y4BjA'>

        <bdo id='y4BjA'></bdo><ul id='y4BjA'></ul>

    1. <legend id='y4BjA'><style id='y4BjA'><dir id='y4BjA'><q id='y4BjA'></q></dir></style></legend>

        <i id='y4BjA'><tr id='y4BjA'><dt id='y4BjA'><q id='y4BjA'><span id='y4BjA'><b id='y4BjA'><form id='y4BjA'><ins id='y4BjA'></ins><ul id='y4BjA'></ul><sub id='y4BjA'></sub></form><legend id='y4BjA'></legend><bdo id='y4BjA'><pre id='y4BjA'><center id='y4BjA'></center></pre></bdo></b><th id='y4BjA'></th></span></q></dt></tr></i><div id='y4BjA'><tfoot id='y4BjA'></tfoot><dl id='y4BjA'><fieldset id='y4BjA'></fieldset></dl></div>

        OpenGL 着色器无法编译

        时间:2023-09-17

          <legend id='jKskn'><style id='jKskn'><dir id='jKskn'><q id='jKskn'></q></dir></style></legend>

            <bdo id='jKskn'></bdo><ul id='jKskn'></ul>
                <tbody id='jKskn'></tbody>

                <i id='jKskn'><tr id='jKskn'><dt id='jKskn'><q id='jKskn'><span id='jKskn'><b id='jKskn'><form id='jKskn'><ins id='jKskn'></ins><ul id='jKskn'></ul><sub id='jKskn'></sub></form><legend id='jKskn'></legend><bdo id='jKskn'><pre id='jKskn'><center id='jKskn'></center></pre></bdo></b><th id='jKskn'></th></span></q></dt></tr></i><div id='jKskn'><tfoot id='jKskn'></tfoot><dl id='jKskn'><fieldset id='jKskn'></fieldset></dl></div>
                <tfoot id='jKskn'></tfoot>

                  <small id='jKskn'></small><noframes id='jKskn'>

                1. 本文介绍了OpenGL 着色器无法编译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我的 OpenGL 项目中的着色器无法编译.我有 Ubuntu 16.04 LTS,使用 CLion.没有找到任何解决方案,所以在这里提问.

                  The shaders in my OpenGL project don't compile. I have Ubuntu 16.04 LTS, using CLion. Didn't find any solution, that's why asking here.

                  这是我的错误列表:

                  ATTENTION: default value of option force_s3tc_enable overridden by environment.
                  ERROR::SHADER::VERTEX::COMPILATION_FAILED
                  0:1(1): error: syntax error, unexpected $end
                  
                  ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
                  0:1(1): error: syntax error, unexpected $end
                  
                  ERROR::SHADER::PROGRAM::LINKING_FAILED
                  error: linking with uncompiled shadererror: linking with uncompiled shader
                  

                  这是我的 main.cpp 代码:

                  Here's my main.cpp code:

                  #include <iostream>
                  
                  // GLEW
                  #define GLEW_STATIC
                  #include <GL/glew.h>
                  
                  // GLFW
                  #include <GLFW/glfw3.h>
                  
                  // Other includes
                  #include "Shader.h"
                  
                  // Window dimensions
                  const GLuint WIDTH = 800, HEIGHT = 600;
                  
                  // The MAIN function, from here we start the application and run the game loop
                  int main( )
                  {
                      // Init GLFW
                      glfwInit( );
                  
                      // Set all the required options for GLFW
                      glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
                      glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
                      glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
                      glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE );
                  
                      glfwWindowHint( GLFW_RESIZABLE, GL_FALSE );
                  
                      // Create a GLFWwindow object that we can use for GLFW's functions
                      GLFWwindow *window = glfwCreateWindow( WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr );
                  
                      int screenWidth, screenHeight;
                      glfwGetFramebufferSize( window, &screenWidth, &screenHeight );
                  
                      if ( nullptr == window )
                      {
                          std::cout << "Failed to create GLFW window" << std::endl;
                          glfwTerminate( );
                  
                          return EXIT_FAILURE;
                      }
                  
                      glfwMakeContextCurrent( window );
                  
                      // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
                      glewExperimental = GL_TRUE;
                      // Initialize GLEW to setup the OpenGL Function pointers
                      if ( GLEW_OK != glewInit( ) )
                      {
                          std::cout << "Failed to initialize GLEW" << std::endl;
                          return EXIT_FAILURE;
                      }
                  
                      // Define the viewport dimensions
                      glViewport( 0, 0, screenWidth, screenHeight );
                  
                      // Build and compile our shader program
                      Shader ourShader( "core.vs", "core.frag" );
                  
                  
                      // Set up vertex data (and buffer(s)) and attribute pointers
                      GLfloat vertices[] =
                              {
                                      // Positions         // Colors
                                      0.5f, -0.5f, 0.0f,   1.0f, 0.0f, 0.0f,  // Bottom Right
                                      -0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,  // Bottom Left
                                      0.0f,  0.5f, 0.0f,   0.0f, 0.0f, 1.0f   // Top
                              };
                      GLuint VBO, VAO;
                      glGenVertexArrays( 1, &VAO );
                      glGenBuffers( 1, &VBO );
                      // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
                      glBindVertexArray( VAO );
                  
                      glBindBuffer( GL_ARRAY_BUFFER, VBO );
                      glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW );
                  
                      // Position attribute
                      glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof( GLfloat ), ( GLvoid * ) 0 );
                      glEnableVertexAttribArray( 0 );
                      // Color attribute
                      glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof( GLfloat ), ( GLvoid * )( 3 * sizeof( GLfloat ) ) );
                      glEnableVertexAttribArray( 1 );
                  
                      glBindVertexArray( 0 ); // Unbind VAO
                  
                      // Game loop
                      while ( !glfwWindowShouldClose( window ) )
                      {
                          // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
                          glfwPollEvents( );
                  
                          // Render
                          // Clear the colorbuffer
                          glClearColor( 0.2f, 0.3f, 0.3f, 1.0f );
                          glClear( GL_COLOR_BUFFER_BIT );
                  
                          // Draw the triangle
                          ourShader.Use( );
                          glBindVertexArray( VAO );
                          glDrawArrays( GL_TRIANGLES, 0, 3 );
                          glBindVertexArray(0);
                  
                          // Swap the screen buffers
                          glfwSwapBuffers( window );
                      }
                  
                      // Properly de-allocate all resources once they've outlived their purpose
                      glDeleteVertexArrays( 1, &VAO );
                      glDeleteBuffers( 1, &VBO );
                  
                      // Terminate GLFW, clearing any resources allocated by GLFW.
                      glfwTerminate( );
                  
                      return EXIT_SUCCESS;
                  }
                  

                  Shader.h 代码:

                  Shader.h code:

                  #ifndef SHADER_H
                  #define SHADER_H
                  
                  #include <string>
                  #include <fstream>
                  #include <sstream>
                  #include <iostream>
                  
                  #include <GL/glew.h>
                  #include <cstring>
                  
                  class Shader
                  {
                  public:
                      GLuint Program;
                      // Constructor generates the shader on the fly
                      Shader( const GLchar *vertexPath, const GLchar *fragmentPath )
                      {
                          // 1. Retrieve the vertex/fragment source code from filePath
                          std::string vertexCode;
                          std::string fragmentCode;
                          std::ifstream vShaderFile;
                          std::ifstream fShaderFile;
                          // ensures ifstream objects can throw exceptions:
                          vShaderFile.exceptions ( std::ifstream::badbit );
                          fShaderFile.exceptions ( std::ifstream::badbit );
                          try
                          {
                              // Open files
                              vShaderFile.open( vertexPath );
                              fShaderFile.open( fragmentPath );
                              std::stringstream vShaderStream, fShaderStream;
                              // Read file's buffer contents into streams
                              vShaderStream << vShaderFile.rdbuf( );
                              fShaderStream << fShaderFile.rdbuf( );
                              // close file handlers
                              vShaderFile.close( );
                              fShaderFile.close( );
                              // Convert stream into string
                              vertexCode = vShaderStream.str( );
                              fragmentCode = fShaderStream.str( );
                          }
                          catch ( std::ifstream::failure e )
                          {
                              std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
                          }
                          const GLchar *vShaderCode = vertexCode.c_str( );
                          const GLchar *fShaderCode = fragmentCode.c_str( );
                          // 2. Compile shaders
                          GLuint vertex, fragment;
                          GLint success;
                          GLchar infoLog[512];
                          // Vertex Shader
                          vertex = glCreateShader( GL_VERTEX_SHADER );
                          glShaderSource( vertex, 1, &vShaderCode, NULL);
                          glCompileShader( vertex );
                          // Print compile errors if any
                          glGetShaderiv( vertex, GL_COMPILE_STATUS, &success );
                          if ( !success )
                          {
                              glGetShaderInfoLog( vertex, 512, NULL, infoLog );
                              std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED
                  " << infoLog << std::endl;
                          }
                          // Fragment Shader
                          fragment = glCreateShader( GL_FRAGMENT_SHADER );
                          glShaderSource( fragment, 1, &fShaderCode, NULL);
                          glCompileShader( fragment );
                          // Print compile errors if any
                          glGetShaderiv( fragment, GL_COMPILE_STATUS, &success );
                          if ( !success )
                          {
                              glGetShaderInfoLog( fragment, 512, NULL, infoLog );
                              std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
                  " << infoLog << std::endl;
                          }
                          // Shader Program
                          this->Program = glCreateProgram( );
                          glAttachShader( this->Program, vertex );
                          glAttachShader( this->Program, fragment );
                          glLinkProgram( this->Program );
                          // Print linking errors if any
                          glGetProgramiv( this->Program, GL_LINK_STATUS, &success );
                          if (!success)
                          {
                              glGetProgramInfoLog( this->Program, 512, NULL, infoLog );
                              std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED
                  " << infoLog << std::endl;
                          }
                          // Delete the shaders as they're linked into our program now and no longer necessery
                          glDeleteShader( vertex );
                          glDeleteShader( fragment );
                  
                      }
                      // Uses the current shader
                      void Use( )
                      {
                          glUseProgram( this->Program );
                      }
                  };
                  
                  #endif
                  

                  这是我的 core.vs:

                  Here's my core.vs:

                  #version 330 core
                  layout (location = 0) in vec3 position;
                  layout (location = 1) in vec3 color;
                  layout (location = 2) in vec2 texCoord;
                  
                  out vec3 ourColor;
                  out vec2 TexCoord;
                  
                  void main()
                  {
                      gl_Position = vec4(position, 1.0f);
                      ourColor = color;
                      // We swap the y-axis by substracing our coordinates from 1. This is done because most images have the top y-axis inversed with OpenGL's top y-axis.
                      // TexCoord = texCoord;
                      TexCoord = vec2(texCoord.x, 1.0 - texCoord.y);
                  }
                  

                  ...和core.frag:

                  ...and core.frag:

                  #version 330 core
                  in vec3 ourColor;
                  in vec2 TexCoord;
                  
                  out vec4 color;
                  
                  // Texture samplers
                  uniform sampler2D ourTexture1;
                  
                  void main()
                  {
                  // Linearly interpolate between both textures (second texture is only slightly combined)
                  color = texture(ourTexture1, TexCoord);
                  }
                  

                  我还附上了我的 CMakeLists.txt.希望能帮到你:

                  I've also attached my CMakeLists.txt. Hope it helps:

                  cmake_minimum_required(VERSION 3.9)
                  project(STUDY_GL)
                  
                  set(CMAKE_CXX_STANDARD 11)
                  
                  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread -fpermissive")
                  
                  find_package (OpenGL REQUIRED)
                  find_package (GLUT REQUIRED)
                  find_package (glfw3 REQUIRED)
                  find_library (glew REQUIRED)
                  find_library (glad REQUIRED)
                  
                  
                  include_directories(${/usr/include/GLFW

                    <tbody id='iF9oM'></tbody>

                2. <small id='iF9oM'></small><noframes id='iF9oM'>

                    <bdo id='iF9oM'></bdo><ul id='iF9oM'></ul>
                    <legend id='iF9oM'><style id='iF9oM'><dir id='iF9oM'><q id='iF9oM'></q></dir></style></legend>

                          <i id='iF9oM'><tr id='iF9oM'><dt id='iF9oM'><q id='iF9oM'><span id='iF9oM'><b id='iF9oM'><form id='iF9oM'><ins id='iF9oM'></ins><ul id='iF9oM'></ul><sub id='iF9oM'></sub></form><legend id='iF9oM'></legend><bdo id='iF9oM'><pre id='iF9oM'><center id='iF9oM'></center></pre></bdo></b><th id='iF9oM'></th></span></q></dt></tr></i><div id='iF9oM'><tfoot id='iF9oM'></tfoot><dl id='iF9oM'><fieldset id='iF9oM'></fieldset></dl></div>
                          <tfoot id='iF9oM'></tfoot>