ios - 不使用任何 Apple API 加载 GLSL 着色器

标签 ios input io glsl opengl-es-2.0

使用 C/C++ 加载 GLSL 着色器而不使用 Objective-C 或任何 Apple API 的好方法是什么?

我目前正在使用以下方法,该方法来自iPhone 3D编程书籍,但它说不建议用于生产代码:

简单.vsh

const char* SimpleVertexShader = STRINGIFY
(

// Shader code...

);

渲染引擎.cpp

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

// ...

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

最佳答案

如果您想从应用程序包中的文件加载着色器,您可以使用 NSBundle 对象(在 Objective-C 中)或使用 CoreFoundation CFBundle< 获取文件路径 对象(纯 C 语言)。

无论哪种方式,您都在使用 Apple 特定的 API。使用 CFBundle 而不是 NSBundle 唯一得到的就是更多的样板代码。

如果您不想使用任何 Apple API,那么您的选择是将着色器嵌入为文字字符串,或连接到 Internet 上的服务器并下载它们(使用 Unix 套接字 API)。

真正需要做的是定义一个接口(interface),您的 RenderingEngine 可以通过该接口(interface)获取其着色器的源代码,并在您的端口所连接的每个平台上使用适当的特定于平台的 API 来实现该接口(interface)渲染引擎。界面可以非常简单,如下所示:

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.cppRenderingEngineShaderSource_iOS.mRenderingEngineShaderSource_Linux.cpp等。每个都实现RenderingEngine_shaderSourceForName code> 使用适合该平台的 API。

关于ios - 不使用任何 Apple API 加载 GLSL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737947/

相关文章:

ios - 在 iOS 上使用 LLVM 编译时,Sqlite FTS 不起作用

ios - 努力在旋转后沿其轴移动节点(Swift | ARKit | SceneKit)

java - 如何清理输入

c# - 如何对文件中的 xml 节点进行排序?

c - 无法在 C 中正确读取文件

ios - PFLogInViewController 问题

ios - 如何从磁盘上的视频文件中获取 NSData

javascript - 使用 Jquery 获取输入值数组

file - 如何重置/清除文件输入

java - Android:无法读取用户使用 URI 中的 getString() 和 getPath() 选择的 PDF 文件