GLKit的GLKBaseEffect和自定义着色器

时间:2012-06-07 14:30:19

标签: ios shader glkit

我一直在研究这个问题,而且我似乎无法理解它已经足够解决它所以我认为我不妨把它扔出去并且聪明的一堆可能有一些想法。 :P

基本上我已经在iPhone项目上工作了一段时间,我可以使用所有最新的框架和目标5.1。所以我一直在使用GLKit和GLKBaseEffect,这对我来说一直很好。我开始使用GLKBaseEffect而不是编写自己的着色器的原因是我不太了解glsl。然而,要求变得更加精确,基本效果似乎不再削减它。

由于我已经使用基本效果进行了所有变换,我更喜欢如果我可以保持基本效果不变但是如果有意义则在顶部添加glsl-type着色器。

我的旧方法看起来像这样(这是一个循环渲染所有对象,其中一个对象包含变换,网格和其他一些不太重要的东西,如纹理,材料等)

ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);

[effect prepareToDraw];
[obj render];

effect.transform.modelviewMatrix = modelView;

在这里,我们获取一个对象来渲染和变换(即平移,旋转和缩放)对象然后我们渲染它,渲染本身抓取对象的网格,绑定缓冲区并渲染它。

到目前为止一切顺利。

我想要做的是,在[obj render];调用期间,我希望该对象也可以像glUseProgram(someProgram);那样添加更专业的着色器代码。

我想有人可能会争辩说我正在尝试为我的顶点着色器使用基本效果,并希望为我的片段着色器使用“普通”着色器。至少那是我认为我想做的事情。

我一直在尝试一些事情。

我尝试在其上创建片段着色器和glUseProgram,但是它说在设置和编译时我需要一个顶点和一个片段着色器。我也尝试创建一个空的顶点着色器,但结果并不是很好,我不知道会发生什么,但我猜它会否决基础效果。

我倾向于,最后接受它可能最好抛弃基本效果,并且一直编写我自己的着色器。我觉得窗外有很多工作,所以我想知道我可以节省多少。

我明白我对着色器的理解是给我带来最大问题的部分,所以请耐心等待。

2 个答案:

答案 0 :(得分:18)

我只是想对任何对它们感兴趣的人给出我的结论。

我所做的实际上是将GLBaseEffect全部抛出并实现了我自己的着色器代码。

我最大的问题是,我真的不明白它是全部或全部可以这么说。

请问我可能错了,所以对我错误的地方的任何更正都会非常感激,我真的不想欺骗任何读这篇文章的人。

我在努力中发现的是几个关键点:

  • GLKBaseEffect,用于模仿固定功能管道,如早期版本的OpenGLES中所示。因此它包装了常见的着色器代码,因此您不必非常关心它。您将拥有基本功能,但它并不是非常可扩展。
  • 如果您编写自己的着色器代码,仍然可以使用GLKit的简洁功能,如纹理加载器,数学库等。因此,如果您想要更复杂或可自定义的内容(凹凸贴图,香椿阴影等),则完全有必要重写正确渲染所需的样板代码。我最初做的是我使用GLKBaseEffect来定位场景,因为它非常舒适且易于使用。但是当我想做更多(切线空间法线贴图)时,由于无法添加到GLKBaseEffect处理的着色器程序,我有点卡住了。
  • 着色器真的没有我想象的那么可怕!我只是不知道它到底是什么意思,我很惊讶我已经阅读了很多关于它们的内容并且仍然没有理解,基本上着色器是替换固定功能管道的程序。就这么简单。

我想这就足够了,只是想跟进并添加到目前为止我收集到的东西。

答案 1 :(得分:11)

就像你发现的那样,你不能只使用片段着色器并留下顶点着色器。这是因为两者都有不同的任务。顶点着色器处理每顶点方面:计算顶点数据,纹理(uv)等,最后绘制面(三角形)。片段着色器处理屏幕上(或视口中)每个像素的确切绘制内容。当您只提供片段着色器时, 告诉您的顶点数据是什么,而不是只告诉OpenGL对像素执行某些操作。这些像素没有任何东西/乱码(我不确定是哪个),因为你的顶点着色器没有做任何事情。

使用GLKEffect时,对[yourEffect prepareToDraw]方法的调用会处理着色器等。

如果您只想使用股票着色器对,为什么不使用XCode OpenGL游戏模板中提供的那个?当你运行它时,它有两个立方体,一个使用GLKit渲染,另一个使用普通方式。虽然我认为对大多数效果来说还不够。如果您想了解有关着色器的更多信息,可以查看NeHe GLSL简介article。它是关于GLSL以及如何在代码中编写和使用着色器。您可能需要查看Diney Bomfim's All About Shaders篇文章以及此page

在大多数情况下使用GLKit很好,因为它可以避免编写大量无用的重复代码。例如,您不必经历具有不同颜色编码和每像素位数(每种格式)的图像格式,只需使用GLKTextureLoader即可。