Загрузка шейдера GLSL без использования API Apple - PullRequest
0 голосов
/ 05 января 2012

Каков хороший способ загрузки шейдера GLSL с использованием C / C ++ без использования Objective-C или каких-либо API-интерфейсов Apple?

В настоящее время я использую следующий метод из iPhone 3DПрограммирование книга, но он говорит, что это не рекомендуется для производственного кода:

Simple.vsh

const char* SimpleVertexShader = STRINGIFY
(

// Shader code...

);

RenderingEngine.cpp

#define STRINGIFY(A) #A
#include "Simple.vsh"

// ...

glShaderSource( shaderHandle, 1, &SimpleVertexShader, 0 );

Ответы [ 3 ]

1 голос
/ 05 января 2012

Если вы хотите загрузить свои шейдеры из файлов в вашем комплекте приложений, вы можете получить пути к файлам, используя объект NSBundle (в Objective-C) или объект CoreFoundation CFBundle (в чистом C).

В любом случае, вы используете специфичные для Apple API.Единственное, что вы получаете, используя CFBundle вместо NSBundle, это больше шаблонного кода.

Если вы не хотите использовать какие-либо API-интерфейсы Apple, тогда вы можете встроить свои шейдеры в буквальный.строк или подключитесь к серверу в Интернете и загрузите их (используя API сокетов Unix).

Что вам нужно действительно , это определить интерфейс, через который ваш RenderingEngine получает источниккод для его шейдеров и реализовать этот интерфейс, используя соответствующий API для конкретной платформы на каждой платформе, к которой ваш порт RenderingEngine.Интерфейс может быть очень простым:

RenderingEngineShaderSourceInterface.h

#ifdef __cplusplus
extern "C" {
#endif

// You are responsible for freeing the C string that this function returns.
extern char const *RenderingEngine_shaderSourceForName(char const *name);

#ifdef __cplusplus
}
#endif

Затем вы создаете RenderingEngineShaderSource_Windows.cpp, RenderingEngineShaderSource_iOS.m, RenderingEngineShaderSource_Linux.cpp и т. Д. Каждый из них реализует RenderingEngine_shaderSourceForName используя соответствующий API для этой платформы.

0 голосов
/ 04 апреля 2013

Рассмотрим необработанный строковый литерал C ++;STRINGIFY не требуется, поскольку новые функции C ++ позволяют вам делать подобные вещи без макроса.

Я бы напечатал хороший пример, но - это один .

0 голосов
/ 05 января 2012

Я использую один из двух методов.Если это короткий шейдер, я могу просто написать код:

const char   shader[] = 
"uniform vec4 blah;\n" // Note, no semicolon here - it does the right thing
"main ()\n"
"{\n"
...rest of code
"}\n";

Или, если он будет длиннее или будет использоваться повторно в других местах, я помещу его в текстовый файл в ресурсах.и прочитайте текстовый файл во время выполнения.Вы можете добраться до него через [NSBundle pathForResource: ofType:].

...