2013-08-14 6 views
0

조각의 색상을 변경하고자하는 조각 쉐이더를 작성했습니다. 예를 들어,받은 색상이 검은 색이면 파란색으로 바꿔야합니다. 조각의 색상 변경

내가 사용하고있는 쉐이더입니다 :

uniform sampler2D mytex; 

layout (pixel_center_integer) in vec4 gl_FragCoord; 

uniform sampler2D texture1; 

void main() 
{ 
    ivec2 screenpos = ivec2  (gl_FragCoord.xy); 
    vec4 color  = texelFetch (mytex, screenpos, 0); 

    if (color == vec4 (0.0,0.0,0.0,1.0)) { 
     color = (0.0,0.0,0.0,0.0); 
    } 

    gl_FragColor = texture2D (texture1, gl_TexCoord[0].st); 
} 

을 그리고 여기에 내가 그것에서 무엇입니까 로그입니다 :

경고 : -1 : 65535 : 'GL_ARB_explicit_attrib_location'확장 GLSL 현재 버전에서 사용할 수없는

WARNING : 0 : 1 : 'texelFetch는'함수는 현재 GLSL 버전을 사용할 수없는

경고는 알고 있지만 어쨌든 컴파일해서는 안됩니까? 쉐이더는 내가하고 싶은 것을하고 있지 않습니다. 왜 누군가가 설명 할 수 있습니까?

+0

미안하지만 그 쉐이더를 읽을 수 없습니다. 사람이 읽을 수있는 방식으로 포맷하는 데 시간을 할애 해 주시겠습니까? –

+2

두 가지 경고와 오류가 있습니다. 나는 OpenGL에 익숙하지 않지만 아마도 오류는 어쨌든 컴파일해서는 안된다는 것을 의미한다. 아마도'color = (...) '보다는'color = vec4 (...)'로 고칠 수있을 것입니다. –

+0

다음 seymours 조언을 따른다. 오류를 수정하지만 쉐이더는 여전히 내가하고 싶은 것을하지 않는다. – user2673108

답변

1

GLSL 구현에서 사용할 수없는 기능을 사용하고 있습니다. 이것들을 호출 한 결과는 정의되지 않습니다.

그러나, 여기 키커 gl_FragColor이 쉐이더에서 color의 값과는 절대적으로 아무것도이없는 것입니다. 따라서 texelFetch (...) 논리가 실제로 올바르게 작동하더라도 color의 값을 변경하면 최종 출력에 아무런 영향을 미치지 않습니다. 스마트 컴파일러는 무 조작으로 이것을보고 효과적으로에 쉐이더를 제거합니다 :

 

uniform sampler2D texture1; 

void main() 
{ 
    gl_FragColor = texture2D (texture1, gl_TexCoord[0].st); 
} 
 


이 충분하지 있다면, texelFetch (...)이 쉐이더에서 완전히 불필요합니다. 셰이더의 현재 프래그먼트에 해당하는 텍셀을 검색하고 텍스쳐가 실제로 드로잉 할 뷰포트와 동일한 크기를 갖는 경우 texture2D (texture1, gl_FragCoord.xy); GLSL의 기본 동작은 gl_FragCoord에 좌표를 제공하기 때문입니다 (x + 0.5, y + 0.5) - 텍스처의 해당 텍셀의 중심이기도합니다 (동일한 해상도 인 경우). 텍스처 필터링이 변경되는 것을 염려하지 않으면 서 전통적인 텍스처 룩업을 수행 할 수 있습니다 귀하의 샘플 결과.

texelFetch (...) 정규화 된 좌표를 사용하지 않고 텍스처에서 명시 적 텍셀을 가져올 수있게 해주는 "어른"사각형 텍스처와 비슷합니다. 일반적으로 멀티 샘플 텍스처를 사용하고 특정 샘플을 원하거나 텍스처 필터링 (밉맵 레벨 선택 포함)을 건너 뛰고 싶다면. 이 경우에는 전혀 필요하지 않습니다.

이 당신이 정말로 (OpenGL을 3.2)를 원하는 아마도 :

 

#version 150 

uniform sampler2D mytex; 
uniform sampler2D texture1; 

layout (location=0) out vec4 frag_color; 
layout (location=1) out vec4 mytex_color; 

void main() 
{ 
    mytex_color = texture2D (mytex, gl_FragCoord.xy); 

    // This is not black->blue like you explained in your question... 
    // ... This is generally opaque->transparent, assuming 4th component = alpha 
    if (mytex_color == vec4 (0.0,0.0,0.0,1.0)) { 
    mytex_color = vec4 (0.0); 
    } 

    frag_color = texture2D (texture1, gl_TexCoord[0].st); 
} 
 

나이가 GLSL 버전에서는, 당신은 glBindFragDataLocation (...)를 사용하여 수동으로 데이터 위치를 설정하거나 out 변수 대신 gl_FragData[n]를 사용해야합니다.

이제 진짜 문제는 샘플링하려는 텍스처의 색상을 변경하려는 것입니다. 그건 잘 작동하지 않을거야, 당신은 두 조각 데이터 출력을 사용해야 할 것입니다.샘플링하는 동일한 텍스처에 쓰기는 매우 통제 된 상황에서 수행 할 수 있지만 일반적으로 텍스처 사이에 핑퐁 (ping-pong)이 있습니다. 즉, 하나의 텍스쳐를 가져 와서 다른 텍스쳐에 쓰고 그 이후의 모든 렌더링 패스는 원본 텍스쳐를 참조하는 것이 방금 쓴 것과 교환되어야합니다.

다중 렌더 대상 그림에 대한 자세한 내용은 "Fragment Data Location"을 참조하십시오.