2017-11-02 6 views
-2

내 코드 투명한 픽셀에 검은 색 픽셀을 변경Opengles 어떻게

vec4 textureColor = texture2D(uTextureSampler, vTextureCoord); 
if(textureColor.r* 0.299 + textureColor.g * 0.587 + textureColor.b * 0.114 < 0.1) { 
    gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); 
} else { 
    gl_FragColor = vec4(textureColor.r, textureColor.g, textureColor.b, textureColor.w); 
} 

내 문제가 어떻게 픽셀이 검은 색 판단이다 하는가? 어떻게 할 수 있습니까? rgb를 hsv로 변경해야합니까?

+0

@BDL 네, 불쌍한 내 영어 –

+0

용서는 그 코드와 함께 일하지 말아야 이유가 표시되지 않습니다를. 'textureColor'가 [0,0,0]이면 투명 픽셀로 끝납니다. (OpenGL 응용 프로그램의 나머지 부분에는 문제가 없다고 가정합니다.) 무조건'gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0); '을 출력하면 어떻게됩니까? – BDL

+0

'if (textureColor.r * 0.299 + textureColor.g * 0.587 + textureColor.b * 0.114 <0.1)'는 검은 픽셀을 판단하고, 검은 픽셀이라면이 픽셀을 투명하게 변경하므로'gl_FragColor = vec4 (0.0, 0.0, 0.0, 0.0);'픽셀을 투명으로 변경합니다. –

답변

0
 return "precision mediump float; \n"+ 
      " varying highp vec2 " + VARYING_TEXTURE_COORD + ";\n" + 
      " \n" + 
      " uniform sampler2D " + TEXTURE_SAMPLER_UNIFORM + ";\n" + 
      " \n" + 
      " void main()\n" + 
      " {\n" + 
      " vec3 keying_color = vec3(0.0, 0.0, 0.0);\n" + 
      " float thresh = 0.45; // [0, 1.732]\n" + 
      " float slope = 0.1; // [0, 1]\n" + 
      " vec3 input_color = texture2D(" + TEXTURE_SAMPLER_UNIFORM + ", " + VARYING_TEXTURE_COORD + ").rgb;\n" + 
      " float d = abs(length(abs(keying_color.rgb - input_color.rgb)));\n" + 
      " float edge0 = thresh * (1.0 - slope);\n" + 
      " float alpha = smoothstep(edge0, thresh, d);\n" + 
      " gl_FragColor = vec4(input_color,alpha);\n" + 
      " }"; 

keying_color 변수에는 대체 할 실제 색상이 저장됩니다. 클래식 RGB 모델을 사용하지만 강도는 0-255 정수로 표시되지 않습니다. 0-1 범위의 부동 소수점 값입니다. 우리의 경우 초록색은 값 (0.647, 0.941, 0.29)을 갖지만, 다른 비디오를 사용한다면 색을 직접 측정하십시오.
참고 : 올바른 색상인지 확인하십시오. 일부 색상 측정 소프트웨어는 색상을 AdobeRGB와 같이 약간 다른 형식으로 자동 변환합니다.
그럼 마술은 어디 있습니까?
input_color에 현재 픽셀 색상을로드 한 다음 입력 색상과 키 색상 간의 차이를 계산합니다. 이 차이를 기반으로 알파 값이 계산되어 특정 픽셀에 사용됩니다.
기울기와 임계 값을 사용하여 비교가 얼마나 엄격한 지 제어 할 수 있습니다. 좀 더 복잡하지만 가장 기본적인 규칙은 : 당신이 가지고있는 문턱 값이 클수록, 더 큰 공차입니다.
그래서, 끝났습니다. 아니.

당신은이 링크를 볼 수 있습니다 http://blog.csdn.net/u012847940/article/details/47441923