2014-12-15 3 views
0

Я пытаюсь объединить два шейдера для создания плавного цвета новой версией OpenGL в Android (обновлено до декабря 2014 года), но не работает. Вот Shader:OpenGL- Объединение двух Shader Gaussian Blur и Contrast

В Gaussian Blur

Vertex Shader:

public static final String VERTEX_SHADER = 
     "attribute vec4 position;\n" + 
       "attribute vec4 inputTextureCoordinate;\n" + 
       "\n" + 
       "const int GAUSSIAN_SAMPLES = 9;\n" + 
       "\n" + 
       "uniform float texelWidthOffset;\n" + 
       "uniform float texelHeightOffset;\n" + 
       "\n" + 
       "varying vec2 textureCoordinate;\n" + 
       "varying vec2 blurCoordinates[GAUSSIAN_SAMPLES];\n" + 
       "\n" + 
       "void main()\n" + 
       "{\n" + 
       " gl_Position = position;\n" + 
       " textureCoordinate = inputTextureCoordinate.xy;\n" + 
       " \n" + 
       " // Calculate the positions for the blur\n" + 
       " int multiplier = 0;\n" + 
       " vec2 blurStep;\n" + 
       " vec2 singleStepOffset = vec2(texelHeightOffset, texelWidthOffset);\n" + 
       " \n" + 
       " for (int i = 0; i < GAUSSIAN_SAMPLES; i++)\n" + 
       " {\n" + 
       "  multiplier = (i - ((GAUSSIAN_SAMPLES - 1)/2));\n" + 
       "  // Blur in x (horizontal)\n" + 
       "  blurStep = float(multiplier) * singleStepOffset;\n" + 
       "  blurCoordinates[i] = inputTextureCoordinate.xy + blurStep;\n" + 
       " }\n" + 
       "}\n"; 

Фрагмент Shader:

public static final String FRAGMENT_SHADER = 
     "uniform sampler2D inputImageTexture;\n" + 
       "\n" + 
       "const lowp int GAUSSIAN_SAMPLES = 9;\n" + 
       "\n" + 
       "varying highp vec2 textureCoordinate;\n" + 
       "varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES];\n" + 
       "\n" + 
       "void main()\n" + 
       "{\n" + 
       " lowp vec3 sum = vec3(0.0);\n" + 
       " lowp vec4 fragColor=texture2D(inputImageTexture,textureCoordinate);\n" + 
       " \n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[0]).rgb * 0.05;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[1]).rgb * 0.09;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[2]).rgb * 0.12;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[3]).rgb * 0.15;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[4]).rgb * 0.18;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[5]).rgb * 0.15;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[6]).rgb * 0.12;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[7]).rgb * 0.09;\n" + 
       " sum += texture2D(inputImageTexture, blurCoordinates[8]).rgb * 0.05;\n" + 
       "\n" + 
       " gl_FragColor = vec4(sum,fragColor.a);\n" + 
       "}"; 

В Contrast:

N O_Vertext_Shader

и пиксельный шейдер:

public static final String CONTRAST_FRAGMENT_SHADER = "" 
     + "varying highp vec2 textureCoordinate;\n" 
     + " \n" 
     + " uniform sampler2D inputImageTexture;\n" 
     + " uniform lowp float contrast;\n" 
     + " \n" 
     + " void main()\n" 
     + " {\n" 
     + "  lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" 
     + "  \n" 
     + "  gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w);\n" 
     + " }"; 

Как я могу это сделать ???, я могу объединить некоторые затенение, но это так трудно в этом случае

К сожалению мой английский не очень хорошо.

Update:

Как можно объединить, если с двумя Резкость шейдера (Слияния Резкость шейдера с Gaussian Blur шейдера):

Два Резкость Shader

Vertex Shader:

public static final String SHARPEN_VERTEX_SHADER = "" + 
     "attribute vec4 position;\n" + 
     "attribute vec4 inputTextureCoordinate;\n" + 
     "\n" + 
     "uniform float imageWidthFactor; \n" + 
     "uniform float imageHeightFactor; \n" + 
     "uniform float sharpness;\n" + 
     "\n" + 
     "varying vec2 textureCoordinate;\n" + 
     "varying vec2 leftTextureCoordinate;\n" + 
     "varying vec2 rightTextureCoordinate; \n" + 
     "varying vec2 topTextureCoordinate;\n" + 
     "varying vec2 bottomTextureCoordinate;\n" + 
     "\n" + 
     "varying float centerMultiplier;\n" + 
     "varying float edgeMultiplier;\n" + 
     "\n" + 
     "void main()\n" + 
     "{\n" + 
     " gl_Position = position;\n" + 
     " \n" + 
     " mediump vec2 widthStep = vec2(imageWidthFactor, 0.0);\n" + 
     " mediump vec2 heightStep = vec2(0.0, imageHeightFactor);\n" + 
     " \n" + 
     " textureCoordinate = inputTextureCoordinate.xy;\n" + 
     " leftTextureCoordinate = inputTextureCoordinate.xy - widthStep;\n" + 
     " rightTextureCoordinate = inputTextureCoordinate.xy + widthStep;\n" + 
     " topTextureCoordinate = inputTextureCoordinate.xy + heightStep;  \n" + 
     " bottomTextureCoordinate = inputTextureCoordinate.xy - heightStep;\n" + 
     " \n" + 
     " centerMultiplier = 1.0 + 4.0 * sharpness;\n" + 
     " edgeMultiplier = sharpness;\n" + 
     "}"; 

Фрагмент Shader:

public static final String SHARPEN_FRAGMENT_SHADER = "" + 
     "precision highp float;\n" + 
     "\n" + 
     "varying highp vec2 textureCoordinate;\n" + 
     "varying highp vec2 leftTextureCoordinate;\n" + 
     "varying highp vec2 rightTextureCoordinate; \n" + 
     "varying highp vec2 topTextureCoordinate;\n" + 
     "varying highp vec2 bottomTextureCoordinate;\n" + 
     "\n" + 
     "varying highp float centerMultiplier;\n" + 
     "varying highp float edgeMultiplier;\n" + 
     "\n" + 
     "uniform sampler2D inputImageTexture;\n" + 
     "\n" + 
     "void main()\n" + 
     "{\n" + 
     " mediump vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb;\n" + 
     " mediump vec3 leftTextureColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb;\n" + 
     " mediump vec3 rightTextureColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb;\n" + 
     " mediump vec3 topTextureColor = texture2D(inputImageTexture, topTextureCoordinate).rgb;\n" + 
     " mediump vec3 bottomTextureColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb;\n" + 
     "\n" + 
     " gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w);\n" + 
     "}"; 
+0

Не мог бы вы сказать мне, почему вы должны создать все те, как строки здесь? Благодарю. – Unheilig

+0

Я хочу сделать гладкий цвет, как камера 360: |. Как вы чувствуете, что – bkit4u

ответ

0

Почему трудно в этом случае? Мне кажется, что все, что вам нужно сделать, это использовать контрастность на гауссовском размытии. Это означает, что вам необходимо объединить последнюю строку (в основном) гауссовом фрагменте размытия шейдера с первой линией в Contrast шейдере:

lowp vec4 textureColor = vec4(sum,fragColor.a); 

И добавить uniform lowp float contrast; на верхней часть затенения. Другое то, что вы держите все от размытия шейдеров выше этой линии, и все из Contrast шейдера ниже этой линии:

uniform lowp float contrast; 

    //.. insert Gaussian shader till gl_FragColor.. 

    lowp vec4 textureColor = vec4(sum,fragColor.a); 
    gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w); 
} 
+0

Большое спасибо, он работает, когда я сливаю Контраст с Гауссовским Размытием – bkit4u

Смежные вопросы