Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios GLKit&x27;s GLKBaseEffect和自定义着色器_Ios_Shader_Glkit - Fatal编程技术网

Ios GLKit&x27;s GLKBaseEffect和自定义着色器

Ios GLKit&x27;s GLKBaseEffect和自定义着色器,ios,shader,glkit,Ios,Shader,Glkit,我一直在研究我遇到的这个问题,我似乎不能很好地理解它来解决它,所以我想我还是把它扔出去,聪明的人可能会有一些想法P 基本上,我已经在一个iPhone项目上工作了一段时间,在这个项目中,我可以奢侈地使用所有最新的框架和target 5.1。所以我一直在使用GLKit和GLKBaseEffect,它们对我来说效果很好。我开始使用GLKBaseEffect而不是编写自己的着色器的原因是我不太了解glsl。然而,需求变得更加精确,基础效应似乎不再能减少需求 由于我已经在使用基本效果进行所有变换,我希望我

我一直在研究我遇到的这个问题,我似乎不能很好地理解它来解决它,所以我想我还是把它扔出去,聪明的人可能会有一些想法P

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

由于我已经在使用基本效果进行所有变换,我希望我能保持基本效果不变,但如果有意义的话,可以在顶部添加glsl类型的着色器

我以前的方法是这样的(这是在循环中渲染所有对象,其中一个对象包含变换、网格和其他一些不太重要的东西,例如纹理、材质等)

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

到目前为止还不错

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

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

我一直在尝试一些事情

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

最后,我倾向于接受这样一个观点,那就是最好抛开基本效果,一路编写自己的着色器。我只是觉得窗外有很多工作要做,所以我想看看我能节省多少


我知道我对着色器的理解是给我带来最多问题的部分,所以请耐心对待这个事实。

正如您所发现的,您不能只使用片段着色器而忽略顶点着色器。这是因为两者都有不同的任务。顶点着色器处理逐顶点方面:计算顶点数据、纹理(uv)等,最后绘制面(三角形)。片段着色器处理在屏幕(或视口)上的每个像素处准确绘制的内容。当您只提供片段着色器时,并不是告诉您的顶点数据是什么,而是告诉OpenGL在像素上做些什么。这些像素不包含任何内容/胡言乱语(我不确定是哪个),因为顶点着色器没有执行任何操作

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

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


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

我只想为所有感兴趣的人给出我的结论

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

我最大的问题是,我没有真正理解,可以说,这是全部还是全部

请注意,我可能是错的,因此如果您能纠正我的错误,我们将不胜感激。我真的不想愚弄任何阅读本文的人。

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

  • GLKBaseEffect旨在模仿OpenGLES早期版本中的固定功能管道。因此,它包装了公共着色器代码,因此您不必太在意它。您将拥有基本的功能,但它实际上不是非常可扩展
  • 如果编写自己的着色器代码,您仍然可以使用GLKit的整洁功能,如纹理加载程序、数学库等。因此,如果您想要更复杂或可自定义的东西(凹凸贴图、卡通着色等),完全值得重写正确渲染所需的锅炉板代码。我一开始做的是,我使用GLKBaseEffect在场景中定位,因为它非常舒适且易于使用。然而,当我想做更多(切线空间法线贴图)时,我有点被卡住了,因为我无法添加到由GLKBaseEffect处理的着色器程序中
  • 着色器真的不像我一直想的那么可怕!我只是不知道它到底意味着什么,我很惊讶我读了这么多关于它们的书,但仍然不明白基本上着色器是取代固定功能管道的程序。就这么简单

我想这已经够多了,我只是想跟进一下,补充一下我目前收集到的信息。

我似乎完全忘了说声谢谢。你提供的链接真的拓宽了我的理解
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;