c++ - 从 .glsl 文件中读取 OpenGL 着色器语言

标签 c++ opengl file-io glsl

我正在尝试从文件中读取着色器字符串;但是,我在 glShaderSource() 遇到了问题功能线。如您所知,glShaderSource()需要 const char** ,我必须声明 char *用于从文件中读取。所以,我正在使用转换来转换类型。

如果我使用 const_cast<const char **> , 形状出现;但是,它的颜色不对(应该是橙色而不是白色)。 如果我使用 reinterpret_cast<const char**> , 我得到一个 Access violation reading location 0x73726576运行时间错误。

那么,我该如何解决这个问题呢?谢谢!

平台:Windows 7、Visual Studio 2010

代码行:

文件:shader.glsl

#version 330

in vec3 vp;

void main() {
  gl_Position = vec4( vp, 1.0);
}

主要():

/* FILE READING */
FILE* shaderFile = fopen( "shader.glsl ", "r");
int fileSize = 0;
char* vertex_shader = NULL;

//Getting File Size
fseek( shaderFile, 0, SEEK_END );
fileSize = ftell( shaderFile );
rewind( shaderFile );

//Reading From File
vertex_shader = (char*)malloc( sizeof( char) * (fileSize+1) );
fread( vertex_shader, sizeof( char ), fileSize, shaderFile );
vertex_shader[ fileSize] = '\0';
fclose( shaderFile );



//Shader definition - If I used this format, it works.
/*const char* vertex_shader = "#version 330\n"
                            "in vec3 vp;"
                            "void main(){"
                            "gl_Position = vec4( vp, 1.0);"
                            "}";*/


    //If I use const char* vertex_shader above, it appears orange.
const char* fragment_shader = "#version 330\n"
                              "out vec4 frag_colour;"
                              "void main () {"
                              "  frag_colour = vec4(0.7, 0.4, 0.2, 1.0);"
                              "}";

//Shader compiling
unsigned int vertexShader = glCreateShader( GL_VERTEX_SHADER );
    //The shape appears but not orange
glShaderSource( vertexShader, 1, const_cast<const char **>(&vertex_shader) , NULL );
//glShaderSource( vertexShader, 1, reinterpret_cast<const char**>(vertex_shader) , NULL ); //Gives error

glCompileShader( vertexShader );

unsigned int fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragment_shader, NULL);
glCompileShader( fragmentShader );

//Shader program
unsigned int shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, fragmentShader );
glAttachShader( shaderProgram, vertexShader );
glLinkProgram( shaderProgram );

//Drawing
while( !glfwWindowShouldClose( window ) )
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glUseProgram( shaderProgram );
    glBindVertexArray( vao );
    glDrawArrays( GL_TRIANGLES, 0, 3);
    glfwPollEvents();
    glfwSwapBuffers( window);
}

最佳答案

将数组的地址传递给函数:

glShaderSource( vertexShader, 1, (const GLchar**)&vertex_shader, NULL);

编辑:

感谢您更新问题中的代码。如果你的程序编译了,没有崩溃,但着色器仍然不工作,是时候调查 GLSL 编译器是否返回了任何错误!每次调用 glCompileShader() 后,编写如下内容以显示编译期间出现的任何问题:

// This checks for errors upon compiling the Vertex Shader
GLint _compiled = 0;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &_compiled);
if (!_compiled)
{
   GLint length;
   GLchar* log;
   glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &length);
   log = new GLchar[length];
   glGetShaderInfoLog(vertexShader, length, &length, log);
   std::cerr << "!!! Compile log = " << log << std::endl;
   delete log;
   return;
}

关于c++ - 从 .glsl 文件中读取 OpenGL 着色器语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753942/

相关文章:

c++ - 无法转换参数

python - Intel HD Graphics 3000 上的 PyOpenGL 访问冲突

OpenGL顶点缓冲区混淆

c++ - 好友声明及其表示的实体

c++ - 构造函数定义中的 void 是什么意思?

C++ 函数写得不好,不知道如何简化它[初学者]

java - C++ IO 与 Java IO

JAVA处理文件出现java.lang.OutOfMemoryError : GC overhead limit exceeded error

c++ - std::ofstream.write() 在写入字符数组时是否比单个字符更快?

c++ - 未格式化的 i/o 进出内存