2012-03-12 186 views
3

我有一个基于OpenGL ES 2.0的iPhone应用程序,我正在运行一些OpenGL ES故障。OpenGL ES 2.0衍生纹理

我想complile片段着色器计算/显示输入纹理的派生。我的片段着色器代码是:

varying highp vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 
uniform sampler2D inputImageTexture2; 

void main(void) 
{ 
    mediump vec4 derivData = vec4(dFdx(texture2D(inputImageTexture, textureCoordinate).xyz, 0.0); 

    gl_FragColor = derivData; 
} 

但是,编译失败。如果我拿出dFdX,它编译得很好。

有没有人有这方面的经验?我最终还想计算关于Y的导数,然后合并它们,看看输入纹理是如何成像的。

我一直在这里挣扎几天,所以你有任何意见将不胜感激!

+0

不幸的是,'dFdx()'不是OpenGL ES 2.0中的内置函数。这些功能的完整列表可以在这个方便的参考卡中找到:http://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf – 2012-03-12 17:35:36

+2

其实,我可能是有点错了。它看起来像'GL_OES_standard_derivatives'扩展名可能出现在iOS设备上,为此提供支持:http://stackoverflow.com/questions/5959542/ios-simulator-gl-oes-standard-derivatives。但是,模拟器似乎缺乏这种支持。 – 2012-03-12 17:40:14

+1

“但是,编译失败。”当它编译失败时,它是否会给你一些错误信息?你能发布该错误消息吗? – 2012-03-12 17:42:33

回答

16

支持ES 2.0所有iOS硬件将支持GL_OES_standard_derivatives扩展:https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html

但是,你不明白这一点“免费”。在您的片段着色器,你必须在顶部添加以下(从http://www.khronos.org/registry/gles/extensions/OES/OES_standard_derivatives.txt):

#extension GL_OES_standard_derivatives : enable 

所有的意见,第一个答案的信息大多是准确的,但没有这一块,你会继续得到以下错误:

ERROR: 0:15: Call to undeclared function 'dFdx' 
ERROR: 0:16: Call to undeclared function 'dFdy' 

这扔我一个循环,但一旦我添加启动线上,似乎器件和模拟器(包括上工作并没有真正evaulate它工作在两个,但它编译)。

+1

谢谢!这也将允许使用fwidth函数。 – chris838 2013-03-29 22:47:33

+0

正是我需要知道的。谢谢! – Tovi7 2015-02-13 09:17:34