2011-04-20 42 views
5

我在學習如何編寫OpenGL着色器。爲什麼在我的機器上運行時,此代碼段錯誤? (我使用Ubuntu 10.04和我把它叫做shader.cpp爲什麼OpenGL着色器分段在調用glCreateShader時出現錯誤?

#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 [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    rm -rf *o $(EXECUTABLE) 

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

這似乎是分割的斷裂該行稱爲glCreateShader。我一直沒有找到這個問題的根源。我是初學者。謝謝!

注意:該代碼代表的是我第一次嘗試使用OpenGL編寫簡單着色器。如果完全錯誤,請隨時發佈一些工作代碼。我真正想要的是獲得我可以編譯和運行的東西。

+0

你知道如何使用gdb嗎?調試將爲您提供有關如何解決問題的更多有用信息。 – colechristensen 2011-04-20 01:33:20

+0

是的,我使用GDB來確定seg故障是在調用glCreateShader的行上,但是這是儘可能多的信息,因爲我知道如何獲取。謝謝! - Steve – 2011-04-20 01:35:23

+0

也許就是這樣吧: 「如果glCreateShader在執行glBegin和執行glEnd之間執行,則會生成GL_INVALID_OPERATION。」 – colechristensen 2011-04-20 01:39:15

回答

10

您無法在真空中創建着色器。它必須使用有效的RenderContext當前創建。事實上,在沒有當前RenderContext的情況下,在OpenGL中可以做的事情非常少。 (創建一個RenderContext留給練習讀者)

另一件需要考慮的事情是你機器上的GL驅動可能不支持着色器。僅僅因爲函數符號的解析並不意味着它可以完成。這是您需要RC的原因之一 - 因此GL運行時可以確定RC所面向的硬件支持哪些功能。

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

相關問題