为什么在调用glCreateShader时,这个OpenGL着色器会出现分段错误?

5

我正在学习如何编写OpenGL着色器。为什么在我的机器上运行此代码时会出现分段错误?(我正在使用Ubuntu 10.04并将其命名为shader.cpp。)

#include <GL/glut.h>
#include <iostream>
using namespace std;

int
main (int argc, char **argv)
{
  GLuint myVertexShader = glCreateShader(GL_VERTEX_SHADER);
  return 0;
}

我使用以下Makefile进行编译:

CC=g++
CFLAGS=-c -Wall -DGL_GLEXT_PROTOTYPES
LDFLAGS= -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm
SOURCES=shader.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=shader

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -rf *o $(EXECUTABLE)

check-syntax:
    $(CC) -o nul -S ${CHK_SOURCES}

似乎是在调用glCreateShader的那一行出现了段错误。我没有找到这个问题的根源,因为我是初学者。谢谢!

注意: 这段代码代表着我第一次尝试使用OpenGL编写简单的着色器。如果全部错误,请随意发布一些可行的代码。我真正想要的是能够编译和运行的东西。


你知道如何使用gdb吗?调试会为你提供更有用的信息,帮助你解决问题。 - colechristensen
是的,我使用了GDB来找出段错误发生在调用glCreateShader的那一行,但这是我所知道的所有信息。谢谢!-- Steve - Steve Johnson
也许就是这样:如果在glBegin和对应的glEnd执行之间执行glCreateShader,则会生成GL_INVALID_OPERATION。 - colechristensen
1个回答

12

在空虚的状态下是无法创建着色器的,必须使用一个有效的RenderContext进行创建。事实上,在OpenGL中如果没有当前的RenderContext,很少有什么可以做的。(创建RenderContext留给读者自行练习)

另一件需要考虑的事情是,您计算机上的GL驱动程序可能不支持着色器。仅仅因为函数符号得到解析并不意味着可以完成操作。这也正是为什么需要RC的原因之一,这样GL运行时就可以确定RC所代表的硬件支持哪些功能。

http://www.opengl.org/wiki/Detecting_the_Shader_Model


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接