首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL装载堆芯

GLSL装载堆芯
EN

Stack Overflow用户
提问于 2014-03-04 11:57:08
回答 1查看 845关注 0票数 2

我正在一台linux机器上编译这个项目。在修复了所有的include和lib错误之后,我得到了一个核心转储错误。但是,如果我将initGLSL行注释掉,它就运行良好。下面给出了initGLSL函数。

代码语言:javascript
复制
void Viewer :: initGLSL( void )
{
   shader.loadVertex( "shaders/vertex.glsl" );
   shader.loadFragment( "shaders/fragment.glsl" );
}

vertex.glsl:

代码语言:javascript
复制
varying vec3 position;
varying vec3 normal;

void main()
{   
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   gl_FrontColor = gl_Color;

   position = gl_Vertex.xyz;
   normal = gl_Normal.xyz; 
}

我不知道如何调试这个程序。如何检查此错误是否是由于GLSL或加载程序函数造成的?

负载函数:

代码语言:javascript
复制
void Shader::loadVertex( const char* filename )
{
   load( GL_VERTEX_SHADER, filename, vertexShader );
}

void Shader::loadFragment( const char* filename )
{
   load( GL_FRAGMENT_SHADER, filename, fragmentShader );
}


void Shader::load( GLenum shaderType, const char* filename, GLuint& shader )
// read vertex shader from GLSL source file, compile, and attach to program
{
   string source;

   if( !readSource( filename, source ))
   {
      return;
   }

   if( program == 0 )
   {
      program = glCreateProgram();
   }

   if( shader != 0 )
   {
      glDetachShader( program, shader );
   }

   shader = glCreateShader( shaderType );
   const char* source_c_str = source.c_str();
   glShaderSource( shader, 1, &(source_c_str), NULL );

   glCompileShader( shader );
   GLint compileStatus;
   glGetShaderiv( shader, GL_COMPILE_STATUS, &compileStatus );

   if( compileStatus == GL_TRUE )
   {
      glAttachShader( program, shader );
      linked = false;
   }
   else
   {
      GLsizei maxLength = 0;
      glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &maxLength );

      if( maxLength > 0 )
      {
         GLchar* infoLog = new char[ maxLength ];
         GLsizei length;

         glGetShaderInfoLog( shader, maxLength, &length, infoLog );

         cerr << "GLSL Error: " << infoLog << endl;

         delete[] infoLog;
      }
   }
}

当我尝试用gdb进行调试时,我得到了msg:

代码语言:javascript
复制
(gdb) p (filename)
$1 = 0x482e41 "shaders/vertex.glsl"
(gdb) n
77        if( program == 0 )
(gdb) n
79           program = glCreateProgram();
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? () 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 05:36:57

在调用OpenGL之前,是否确实创建了shader.load*上下文?

例如,如果您正在使用相应的库,请使用其中之一:

代码语言:javascript
复制
glutInit
glutCreateWindow

glfwInit
glfwCreateWindow

SDL_init 
SDL_CreateWindow
SDL_GL_CreateContext

我对此没有多少经验,但一些GL函数在默认情况下不会在运行时链接--在创建上下文之后,glCreateProgram可能仍然是NULL。我使用GLEW来为我(glewInit())做这件事,但是还有其他的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22171300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档