2010-03-21 3 views
1

C++/OpenGL/Cg를 사용하여 실행되는 GPGPU 유체 시뮬레이션을 작성하고 있습니다. 현재 라이브러리는 사용자가 셰이더 경로를 지정해야하며, 셰이더 경로를 지정합니다.C++에서 cg 쉐이더 내장하기 GPGPU 라이브러리

내 자신의 프로젝트와 테스트에서이를 지정해야한다는 것이 매우 귀찮습니다. 나머지 셰이더 내용을 연결하고 싶습니다.

이상적으로 내 .cg 파일은 여전히 ​​별도로 탐색 할 수 있지만 빌드 후 단계 또는 사전 처리기 지시문은 필요한 경우 원본에 포함합니다.

좀 더 짜증나게하기 위해 필자는 3d 텍스처 좌표를 2 차원 아틀라스로 변환하는 것과 같은 기능을 포함하는 "utils"쉐이더 파일을 가지고 있습니다.

가능한 경우 크로스 플랫폼 솔루션을 원합니다.하지만 현재는 Windows 전용이므로 문제가 아닙니다. 내 검색은 실제로 리눅스의 경우 objcopy으로 바뀌었지만 Windows 용으로 검색하면 이상적이지 않습니다. 도움이된다면

는,이 프로젝트는 당신이 당신의 바이너리 문자열로 포함 된 쉐이더를 원하는 뜻 http://code.google.com/p/fluidic

답변

0

에서 사용할 수 있습니까? 필자는 어떤 플랫폼 간 도구/라이브러리에 대해서도 잘 모르고 있습니다. 바이너리가 다른 형식 일 것이기 때문에 그다지 놀랄만 한 것은 아닙니다.

Windows의 경우 string resource으로 저장하려는 것처럼 들립니다. 그런 다음 LoadString()을 사용하여 문자열을 읽을 수 있습니다. Here's how to add them이지만 파일에 연결할 수있는 것처럼 보이지는 않습니다.

특히 해커가 있지만 플랫폼 간 솔루션은 셰이더를 헤더의 문자열 상수로 변환하는 스크립트를 작성하는 것일 수 있습니다. 그러면 코드에서 #include을 그냥 쓸 수 있습니다.

e.e. 당신이 들어있는 파일 myshader.shader 있습니다

int aFunction(int i, int j) 
{ 
    return i/j; 
} 

을 그리고 당신과 같은 파일 myshader.shader.h 생성하는 빌드 단계가 있습니다

const char[] MYSHADER_SHADER = 
"int aFunction(int i, int j)" 
"{" 
" return i/j;" 
"}"; 

그런 다음 코드에 #include "myshader.shader.h"를 추가합니다.

매우 해킹되었지만 작동하지 않는 이유는 없습니다 (문자열 리터럴의 길이/공백 제한 제외).

업데이트 : G ++ 4.5 릴리스에서는 C++ 0x 원시 문자열 리터럴을 지원합니다. 여기에는 새 줄 4이 포함될 수 있습니다. 나는 이것을 테스트하지 않았지만 다음과 같이 할 수 있어야합니다 :

const char[] MY_SHADER = R"qazwsx[ 
#include "my_shader.c" 
]qazwsx"; 

아직 테스트하지 않았습니다.

+0

그래, 나는 헤더 파일 생성 방법보다 덜 해킹 된 솔루션을 원했다. 쉐이더를 문자열 리소스로 사용하는 것은 정말 고통 스럽습니다. 왜냐하면 모든 구문 hightlighty의 장점을 잃어 버리고 'cgc'를 사용하여 컴파일 오류를 검사하는 기능 (물론 다른 파일에 복사/붙여 넣기를하지 않아도 됨)이 가능하기 때문입니다. 이 작업을 훌륭하게 수행 할 방법이 없다는 사실을 받아 들여야하며 해킹과 관련이 있습니다. – XwipeoutX