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を使用して単純なシェーダーを作成する最初の試みです。それがすべて間違っている場合は、いくつかの実用的なコードを投稿してください。私が本当に欲しいのは、コンパイルして実行できるものを手に入れることです。

4

1 に答える 1

10

真空中でシェーダーを作成することはできません。有効なRenderContextcurrentを使用して作成する必要があります。実際のところ、現在のRenderContextなしでOpenGLで実行できることはほとんどありません。(RenderContextの作成は、読者の演習として残されています)

考慮すべきもう1つの点は、マシンのGLドライバーがシェーダーをサポートしていない可能性があることです。関数シンボルが解決されたからといって、それが実行できるとは限りません。これは、RCが必要な理由の一部です。したがって、GLランタイムは、RCが前面にあるハードウェアでサポートされている機能を判別できます。

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

于 2011-04-20T01:46:06.953 に答える