2009-12-17 4 views
2

GLSL example을 실행하려고하는데 할 수 없습니다.GLSL 프로그램을 컴파일하고 실행하는 데 필요한 것은 무엇입니까?

오류는 프로그램이 종료되는 glGetShaderiv(vShader, GL_COMPILE_STATUS, &status); 행에 있습니다. vShadervPhong.glsl 파일입니다. 오류가 반환

이다 : 나는 '설치'와 GLEW와 과잉과 lib 디렉토리 - 파일을 참조했다

0(18) : error C0000: syntax error, unexpected $undefined at token "<undefined>" 
0(18) : error C0501: type name expected at token "<undefined>" 

. 나는 glewInit을 내 프로그램에 추가했습니다.

프로그램은 .glsl 파일을 찾을 수 있습니다.

이상한 점은 precompiled GLSL-demo을 실행할 수 있으며 컴파일하고 내 컴퓨터에서 the project을 실행한다는 것입니다. 작동하지 않는 프로그램의 "초기화"는 동일합니다.

성공적인 프로젝트에 결함이있는 소스를 복사하여 프로젝트 설정에 오류가 발생했는지 확인하려고했지만 불행히도 그렇지 않았습니다. 그래서 오류가 프로젝트가 아니라 C++ 코드에있는 것 같습니다.


는 PROGRESS : Visual Studio를 통해 실행할 때 내 Windows 7 시스템에서

은 내가 "액세스 위반"을 얻었다. 내가 "혼자"그것을 실행하면 프로그램이 작동을 멈췄습니다. Windows XP 시스템에서 잡히지 않은 예외가 발생했습니다.

프로그램을 컴파일 할 때 오류 또는 경고가 표시되지 않았습니다 (fopen가 안전하지 않다는 경고 제외).

Visual Studio에서 오류 소스로 vShader = glCreateShader(GL_VERTEX_SHADER);을 강조 표시했습니다.

glewInit();을 추가하면 위의 오류가 수정되었습니다.

+0

제공하신 링크가 깨졌습니다. – ufukgun

+0

조금 더 많은 정보가 프로그램이 작동을 멈출 때 (비주얼 스튜디오를 통해 실행하면 예외의 근원을 보여줄 것이라고 가정합니다) 또한 도움이 될 것입니다. (링크가 고정되어 있으면 ...) – Grizzly

+0

링크 isn 더 이상 깨진 게 아니야. :) 오류가 발생한 부분에 대한 정보를 더 제공했습니다. – jumoel

답변

2

program에는 두 가지 오류가있었습니다.

첫째 : 마지막 줄은 glGetProgramiv(program, GL_LINK_STATUS, &status);을 했어야

glLinkProgram(program); 
glGetShaderiv(program, GL_LINK_STATUS, &status); 

.

또한 대신 rb을 인수로 사용하여 쉐이더 파일을 읽은 fopen을 사용해야합니다.

glGetProgramiv으로 대체하고 glewInit()을 추가하면 초기 오류가 수정되었습니다.

인수를 fopen으로 변경하면 셰이더 오류가 해결되었습니다.

0

어떻게 코드를 컴파일했는지 잘 모르겠습니다. Windows API에서 직접 사용할 수없는 GL API를 사용하고 있습니다. 모든 셰이더 API는 해당 범주에 있습니다.

Windows에서 액세스하려면 일반적으로 wgl로 제공되는 확장 프로그램을 사용하거나 확장 프로그램 래퍼를 사용해야합니다.

비켜 glew 초기화와

그래서 ...를 [편집 추가]!

GLint blen = 0; 
GLsizei slen = 0; 

glGetShaderiv(ShaderObject, GL_INFO_LOG_LENGTH , &blen);  

if (blen > 1) 
{ 
GLchar* compiler_log = (GLchar*)malloc(blen); 

glGetInfoLogARB(ShaderObject, blen, &slen, compiler_log); 
cout << "compiler_log:\n", compiler_log); 
free (compiler_log); 
} 
+0

작성한대로 : 저는 GLEW를 사용하고 있습니다. 링크 된 소스 파일과 내가 사용하고있는 유일한 차이점은 대신 을 포함한다는 것입니다. – jumoel

+0

doh, 죄송합니다. 음, glew가이 문제를 숨길 가능성이 높습니다. 니가 놀았 니? glCreateShader의 가치는 무엇입니까? – Bahbar

+0

init glew -_-를 깜박했습니다. 이제 버텍스 쉐이더는 컴파일되지 않습니다. – jumoel

0

그 오류 메시지가 일반적으로 쉐이더 프로그램 파일 자체에 오류가 어떤 종류의 존재 의미 쉐이더 컴파일 (this tutorial에서 촬영) 구축에 실패 빌드 로그를 제공합니다. 내 경험상, 파일의 시작 부분이나 끝 부분에 예기치 않은 문자가 있습니다. 해당 URL의 텍스트를 복사하여 메모장이나 gedit에 붙여 넣은 다음 파일을 저장하십시오.

1

이러한 오류는 C++ 컴파일러가 아닌 GLSL 컴파일러에서 발생합니다. 18 번째 라인의 쉐이더에서는 GLSL 컴파일러를 혼란스럽게합니다. 아마 임의의 쓰레기 또는 인쇄 할 수없는 문자.이를 수행하는 한 가지 쉬운 방법은 쉐이더 소스에 너무 긴 길이 (또는 전혀 길이가 없음)를 지정하고 문자열 끝에 NUL 종료자가 없도록하는 것입니다.

관련 문제