从.glsl文件读取OpenGL着色器语言 [英] Reading OpenGL Shader Language from .glsl File

查看:2729
本文介绍了从.glsl文件读取OpenGL着色器语言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从文件中读取着色器字符串;不过,我在 glShaderSource()函数行遇到了一个问题。如您所知, glShaderSource()需要 const char ** ,我必须声明 char * 从文件读取。如果我使用 const_cast< const char **>< / code>,那么我将使用cast来转换类型。形状出现;然而,它有错误的颜色(它应该是橙色不是白色的)。
如果使用 reinterpret_cast< const char **> ,我得到一个访问冲突读取位置0x73726576 错误在运行时间。

那么,我该如何解决这个问题呢?代码行:



平台:Windows 7,Visual Studio 2010


$ b

档案: shader.glsl



  #version 330 

在vec3 vp;

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

$ / code $ / pre

$ p
$ b $

  / *文件读取* / 
文件* shaderFile = fopen(shader.glsl,r);
int fileSize = 0;
char * vertex_shader = NULL;

//获取文件大小
fseek(shaderFile,0,SEEK_END);
fileSize = ftell(shaderFile);
倒带(shaderFile);
$ b $ //读取文件
vertex_shader =(char *)malloc(sizeof(char)*(fileSize + 1));
fread(vertex_shader,sizeof(char),fileSize,shaderFile);
vertex_shader [fileSize] ='\0';
fclose(shaderFile);



//着色器定义 - 如果我使用这种格式,它可以工作。
/ * const char * vertex_shader =#version 330 \\\

in vec3 vp;
void main(){
gl_Position = vec4(vp,1.0);
}; * /


//如果我使用上面的const char * vertex_shader,它会显示橙色。
const char * fragment_shader =#version 330\\\

out vec4 frag_colour;
void main(){
frag_colour = vec4(0.7,0.4,0.2,1.0);
};

// Shader编译
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
//形状出现,但不是橙色
glShaderSource(vertexShader,1,const_cast< const char **>(& vertex_shader),NULL);
// glShaderSource(vertexShader,1,reinterpret_cast< const char **>(vertex_shader),NULL); //给出错误

glCompileShader(vertexShader);

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

//着色器程序
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram,fragmentShader);
glAttachShader(shaderProgram,vertexShader);
glLinkProgram(shaderProgram);
$ b $ //绘制
while(!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES,0,3);
glfwPollEvents();
glfwSwapBuffers(window);


解决方案

传递地址


$ b

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

编辑

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

  //在编译顶点着色器时检查错误
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<< !!!编译日志=<<日志<<的std :: ENDL;
删除日志;
return;
}


I am trying to read shader strings from a file; however, I faced with a problem at glShaderSource() function line. As you know, glShaderSource() takes const char**, and I have to declare char * for reading from the file. So, I am using casting to convert types.

If I use const_cast<const char **>, the shape appears; however, it has wrong color (It should be orange not white). If I use reinterpret_cast<const char**>, I get a Access violation reading location 0x73726576 error in running time.

So, how can I solve this problem? Thank you!

Platform: Windows 7, Visual Studio 2010

Code Lines:

File: shader.glsl

#version 330

in vec3 vp;

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

main():

/* 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);
}

解决方案

Pass the address of the array to the function:

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

EDIT:

Thanks for updating the code in the question. If your program compiles, doesn't crash but the shaders still don't work, it's time to investigate if the GLSL compiler returned any errors! After each call to glCompileShader() write something like the following to display any problems that occurred during compilation:

// 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;
}

这篇关于从.glsl文件读取OpenGL着色器语言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆