我一直在研究这个问题,但似乎无法完全理解它以便解决它,所以我想把它放到这里,让聪明的人们给出一些想法。
基本上,我已经在一个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
,但是当设置和编译它时,它说我需要一个顶点着色器和一个片段着色器。我还尝试创建一个空的顶点着色器,但是结果不太好,我不知道发生了什么,但我猜它会覆盖基本效果。
最终,我倾向于接受这个事实,即最好丢弃基本效果并完全编写自己的着色器。我只是觉得这样做需要很多工作,所以我想看看我能节省多少工作。
我确实理解我的着色器理解是给我带来最大问题的部分,所以请耐心等待。