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

时间:2011-04-20 01:23:40

标签: c++ opengl glsl shader vertex-shader

我正在尝试学习如何编写 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编写一个简单的着色器。如果一切都搞错了,请随意发布一些有效的代码。我真正想要的是得到一些我可以编译和运行的东西。

1 个答案:

答案 0 :(得分:10)

您无法在真空中创建着色器。必须使用有效的RenderContext当前创建它。事实上,没有当前的RenderContext,在OpenGL中可以做的很少。 (创建RenderContext会留给读者练习)

要考虑的另一件事是机器上的GL驱动程序可能不支持着色器。仅仅因为函数符号解析并不意味着它可以完成。这是您需要RC的部分原因 - 因此GL运行时可以确定RC所面向的硬件支持哪些功能。

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