为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?

Posted

技术标签:

【中文标题】为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?【英文标题】:Why does this OpenGL Shader segmentation fault on calls to glCreateShader?为什么调用 glCreateShader 时这个 OpenGL 着色器分段错误? 【发布时间】:2011-04-20 01:23:40 【问题描述】:

我正在尝试学习如何编写 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吗?调试将为您提供有关如何解决问题的更多有用信息。 是的,我使用 GDB 来确定 seg 错误在调用 glCreateShader 的线路上,但这是我知道如何获取的尽可能多的信息。谢谢! ——史蒂夫 也许是这样:“如果在glBegin的执行和对应的glEnd执行之间执行了glCreateShader,就会产生GL_INVALID_OPERATION。” 【参考方案1】:

您不能在真空中创建着色器。它必须使用有效的 RenderContext current 创建。事实上,在没有当前 RenderContext 的情况下,OpenGL 几乎没有什么可以做的。 (创建 RenderContext 留给读者作为练习)

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

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

【讨论】:

以上是关于为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

调用glCreateShader崩溃的问题及解决

glCreateShader 崩溃了

glCreateShader(GL_VERTEX_SHADER);访问冲突执行位置

在windows系统中对套接字数据进行io时为啥不可以直接使用文件io相关函数?

为啥在 Node.js 中阻塞文件 I/O 时异步性能更差?

glCreateShader 上的 GLUT 分段错误