GLKit的GLKBaseEffect和自定义着色器

qri*_*kko 12 shader ios 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;
Run Code Online (Sandbox Code Playgroud)

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

到现在为止还挺好.

然而,我想要做的是,在[obj render];调用期间,我希望对象也可以执行类似glUseProgram(someProgram);添加更专业的着色器代码的操作.

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

我一直在尝试一些事情.

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

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

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

qri*_*kko 18

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

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

我最大的问题是,我并不是真的明白它可以说是全部或者全部.

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

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

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

这就是我想的足够的咆哮,只是想跟进并添加我迄今收集到的那些点点滴滴.


KK.*_*KK. 11

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

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

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

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