2015-09-14 59 views
1

我尝试在OpenGL ES 2.0中编写一个小程序。但我发现我很难检查着色语言中的变量。如何在顶点着色器中打印浮点值

例如,我想知道顶点着色器中的值。我会将该值传递给片段着色器,并将其值设为glFragColor中的红色。但我发现它很难通过价值。如果我使用varying来声明该值,那么值将会改变。

这里是代码,日志是我想打印的值。

public static final String VERTEX_SHADER = 
      "attribute vec4 position;\n" + 
        "attribute vec2 inputTextureCoordinate;\n" + 
        "\n" + 
        "uniform float texelWidthOffset; \n" + 
        "uniform float texelHeightOffset; \n" + 
        "\n" + 
        "varying vec2 centerTextureCoordinate;\n" + 
        "varying vec2 oneStepLeftTextureCoordinate;\n" + 
        "varying vec2 twoStepsLeftTextureCoordinate;\n" + 
        "varying vec2 oneStepRightTextureCoordinate;\n" + 
        "varying vec2 twoStepsRightTextureCoordinate;\n" + 
        "varying float log;\n" + 
        "\n" + 
        "void main()\n" + 
        "{\n" + 
        "log = -0.1;\n" + 
        "gl_Position = position;\n" + 
        "vec2 firstOffset;\n" + 
        "vec2 secondOffset;\n" + 
//     "if (sqrt(pow(position.x, 2) + pow(position.y, 2)) < 0.2) {\n" + 
//     "log = -position.x;\n" + 
        "if (position.x < 0.3) {\n" + 
        "log = 0.7;\n" + 
        "firstOffset = vec2(3.0 * texelWidthOffset, 3.0 * texelHeightOffset);\n" + 
        "secondOffset = vec2(3.0 * texelWidthOffset, 3.0 * texelHeightOffset);\n" + 
        "} else {\n" + 
        "firstOffset = vec2(texelWidthOffset, texelHeightOffset);\n" + 
        "secondOffset = vec2(texelWidthOffset, texelHeightOffset);\n" + 
        "log = -0.1;\n" + 
        "}\n" + 
        "\n" + 
        "centerTextureCoordinate = inputTextureCoordinate;\n" + 
        "oneStepLeftTextureCoordinate = inputTextureCoordinate - firstOffset;\n" + 
        "twoStepsLeftTextureCoordinate = inputTextureCoordinate - secondOffset;\n" + 
        "oneStepRightTextureCoordinate = inputTextureCoordinate + firstOffset;\n" + 
        "twoStepsRightTextureCoordinate = inputTextureCoordinate + secondOffset;\n" + 
        "}\n"; 





    public static final String FRAGMENT_SHADER = 
      "precision highp float;\n" + 
        "\n" + 
        "uniform sampler2D inputImageTexture;\n" + 
        "\n" + 
        "varying vec2 centerTextureCoordinate;\n" + 
        "varying vec2 oneStepLeftTextureCoordinate;\n" + 
        "varying vec2 twoStepsLeftTextureCoordinate;\n" + 
        "varying vec2 oneStepRightTextureCoordinate;\n" + 
        "varying vec2 twoStepsRightTextureCoordinate;\n" + 
        "varying float log;\n" + 
        "\n" + 
        "void main()\n" + 
        "{\n" + 
        "if (log != -0.1) {\n" + 
        "gl_FragColor.rgba = vec4(log, 0.0, 0.0, 1.0);\n" + 
//     "return;\n" + 
//     "}\n" + 
        "} else { \n" + 
        "lowp vec4 fragmentColor;\n" + 
        "fragmentColor = texture2D(inputImageTexture, centerTextureCoordinate) * 0.2;\n" + 
        "fragmentColor += texture2D(inputImageTexture, oneStepLeftTextureCoordinate) * 0.2;\n" + 
        "fragmentColor += texture2D(inputImageTexture, oneStepRightTextureCoordinate) * 0.2;\n" + 
        "fragmentColor += texture2D(inputImageTexture, twoStepsLeftTextureCoordinate) * 0.2;\n" + 
        "fragmentColor += texture2D(inputImageTexture, twoStepsRightTextureCoordinate) * 0.2;\n" + 
        "\n" + 
        "gl_FragColor = fragmentColor;\n" + 
//     "gl_FragColor.rgba = vec4(0.0, 1.0, 0.0, 1.0);\n" + 
//     "}\n" + 
        "}\n"; 

或者有没有更好的方法来做到这一点。

回答

2

在比较浮点值,而不是这样做:

if (log != -0.1)

您应该允许的值小三角形/公差占浮点精度和最终值“改变”,你可能作为变化传递它。

所以,你应该这样做:

if (abs(log - (-0.1)) >= 0.0001)

这里我选择的0.0001是有点任意的......它是一个很小的值...

==另一个例子

相反的:

if (log == 0.7)

if (abs(log - 0.7) <= 0.0001)

但是这里也可能有另外一个问题:

  1. 顶点着色器执行每3个顶点的所有三角形(或四边形)
  2. 因此对于中您可以为每个顶点设置不同的值(-0.10.7log
  3. 现在问题是,在片段着色器中,GPU将在3个日志值之间进行插值,具体取决于它所呈现的像素......因此最终您可以在屏幕上显示的[-0.1,0.7]间隔中获得任何值: - (

为了避免这种问题,我个人使用#ifdef在我的着色器能够正常和调试模式之间切换他们,并与按键在两者之间可以切换。我从不尝试根据if测试混合正常和调试显示,特别是当测试基于顶点位置时。

所以你的情况我会首先创建着色器的特定调试版本,然后用0.01.0作为值log,这样你会看到什么是红色的渐变,越红的颜色,越靠近你是想要测试的情况。