2012-06-07 57 views
12

我一直在研究这个问题我有,我似乎无法理解它足够好解决它,所以我想我不妨把它扔出去,智能束可能有一些想法。 :PGLKit的GLKBaseEffect和自定义着色器

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

因为我已经做使用基数效应的影响,我宁愿如果我能保持我的基数效应不变,但在上面添加GLSL型着色器,如果让任何意义我所有的转换。

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

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,但是它表示在设置和编译它时需要一个顶点和一个片段着色器。我也试图创建一个空的顶点着色器,这个着色器效果并不好,我不知道会发生什么,但我猜测它推翻了基本效果。

我扶着走向,到底会接受,它可能是最好的抛出了基数效应,只是写我自己的着色器的所有道路。我只是觉得在窗外工作很多,所以我想看看我可以节省多少钱。

我也明白,我的着色器的理解是给我最多的问题的一部分,所以请耐心等待与事实。

回答

11

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

当使用GLKEffect,调用该方法[yourEffect prepareToDraw]负责着色器等

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

在大多数情况下使用GLKit是非常好的,因为它可以帮助您避免编写大量无用的重复代码。例如,您不必通过使用GLKTextureLoader即可使用不同颜色编码和每像素位数(每种格式)的所有图像格式。

+0

我似乎已经完全忘记了实际上说谢谢你提供的链接确实拓宽了我的理解。我很高兴我问,即使在问的时候我觉得我根本不知道我实际上做了什么要求......这么好的工作搞清楚了;)谢谢。 – qrikko

+0

非常感谢。我很沮丧,我的着色器正在编译和链接,但没有输出任何东西。去掉prepareToDraw的这个调用就行了。生活很好! – VaporwareWolf

18

我只是想给我感兴趣的人的结论。

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

我最大的问题是我并不真正了解它是全部或全无可以这么说。

请我可能是错的,所以任何纠正我错在哪里将不胜感激,我真的不想欺骗任何人阅读此。

我发现了什么在我的努力是几个关键点:

  • GLKBaseEffect,是为了模仿固定功能管线与早期版本的OpenGLES的观察。因此它包装了常见的着色器代码,所以你不必非常关心它。你将拥有基本的功能,但它不是非常的可扩展。
  • 如果您编写自己的着色器代码,仍然可以使用GLKit的整洁特性,例如纹理加载器,数学库等。因此,如果您想要更复杂或可定制的东西(凹凸贴图,香椿着色等),完全值得重写正确渲染所需的样板代码。我最开始做的是我使用GLKBaseEffect来定位场景,因为它非常舒适,易于使用。然而,当我想要做更多的事情时(切线空间法线贴图),由于我无法添加到由GLKBaseEffect处理的着色器程序中,所以我陷入了困境。
  • 着色器确实没有我一直认为的那么可怕!我只是不知道它的真正含义,我很惊讶我已经阅读了很多关于它们的知识,但仍然没有理解基本着色器是REPLACING固定功能管道的程序。就那么简单。

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

+0

嗨qrikko我可以给你发电子邮件了解一个潜在的项目吗?感谢您的详细解答! – Crashalot

+0

绝对没有问题,我总是试图在这么辛苦,因为它对于很多人来说都是如此重要的资源。 :) – qrikko

+0

很酷谢谢,你的电子邮件是什么? – Crashalot