2013-07-30 4 views
2

다음과 같은 문제가 있다고 가정 해 봅니다. 이제 프레임 버퍼가 있고 텍스처에 이미 하나의 색상 구성 요소 (예 : GL_RED) 만 포함되어 있습니다. 이미 바인딩되어 있습니다. 조각 셰이더는 어떻게 생겼을까요? 내 대답은 :GLSL 프래그먼트 셰이더 출력 유형

... out float ex_color;

ex_color = ...;

내 질문은 다음과 같습니다. 쉐이더가 프레임 버퍼의 형식을 자동으로 감지하여 값을 쓸까요? 프래그먼트 셰이더가 부동 소수점 값을 출력하지만 프레임 버퍼 형식이 GL_RGBA 인 경우 어떻게합니까?

그런데 올바른 방법으로 텍스처를 만들려면 하나의 구성 요소 만 있습니까? 다음과 같은 샘플이있는 g-truc의 예제를 읽었습니다.

glTexImage2D (GL_TEXTURE_2D, 0, GL_RED, GLsizei (Texture.dimensions(). x), GLsizei (Texture.dimensions(). y), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

픽셀 데이터 형식으로 GL_RGB를 할당한다는 것은 무엇을 의미합니까?

+0

'GL_RED'가 유효한 내부 형식이라고 생각하지 않습니다. 필요한 것은 실제 크기의 내부 형식 (아마도'GL_R8') 일 것입니다. –

+0

그래서 여기는 혼란 스럽습니다. 그러나이 샘플은 모두 실행 한 후에도 잘 실행됩니다. glTexImage2D 함수에서 내부 형식, 형식 및 형식에 대해 더 자세히 설명 할 수 있습니까? – user2310794

+0

* "여기가 내가 혼란 스럽다."* - 당신이 혼란스러워하는 유일한 것이 아닙니다. 하지만 지금 당장은 모든 것을 잘 설명 할 시간이 없으므로 * Nicol Bolas *, datenwolf * 또는 다른 누군가가 뛰어 들어 모든 사람에게 진정한 답을주기를 바랍니다. 그 질문들. –

답변

5

vertex shader inputs처럼 glVertexAttribPointer에 의해 지정된 데이터의 정확한 크기와 일치 할 필요가 없습니다. fragment shader outputs은 작성중인 이미지의 정확한 크기와 일치하지 않아도됩니다. 출력이 대상 이미지 형식보다 많은 구성 요소를 제공하는 경우 추가 구성 요소가 무시됩니다. 값이 더 적 으면 다른 구성 요소에는 정의되지 않은 값이 있습니다 (정점 입력과 달리 지정되지 않은 값이 잘 정의 된 값을 가짐).

픽셀 데이터 형식으로 GL_RGB를 할당한다는 것은 무엇을 의미합니까?

그건 pixel transfer format입니다. OpenGL이 제공하는 형식이 아닌 OpenGL에 제공하는 픽셀 형식을 설명합니다.

항상 sized internal formats을 사용하고 GL_RED과 같은 크기가 작은 것은 사용하지 않아야합니다.

+0

glTexImage2D 함수의 "internal format"매개 변수는 메모리에 저장된 색상 구성 요소와 "format"매개 변수가 사용자 메모리에서 선택한 구성 요소의 순서를 나타내는 방법을 나타 냅니까? OpenGL이 항상 "내부 형식"으로 색상을 저장하고 OpenGL에게 픽셀 해석 형식을 지정하여 데이터를 해석하고 메모리로 복사하는 방법을 알릴 수 있습니까? – user2310794

+0

@ user2310794 : "OpenGL은 항상 네 가지 구성 요소에 색상을 저장합니다."질감 저장은 저장하라는 것을 저장합니다. –

+0

그래, 나 한테 실수 한거야 ... 나에게 아주 분명해, 많은 감사! – user2310794

3

내부 형식 및 형식의 괜찮은 설명은 다음을 참조하십시오

http://opengl.org/wiki/Image_Formathttp://opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml을.

기본적으로 GL_RED 형식을 원하며 내부 형식에 대해 GL_R8 (부호없는 정규화 된 8 비트 고정 소수점)이 필요할 수 있습니다.

오래 전, 루미넌스 텍스처가 단일 채널의 표준 이었지만 현대 GL에서는 사용되지 않는 형식이며 빨강은 이제 빨강/녹색이있는 것처럼 단일 채널의 논리적 "드로어 블"텍스처 형식입니다. 2 채널을위한 가장 논리적 인 포맷.

쉐이더의 경우 핵심 사양에서 정의한 구성 요소 확장에 대한 규칙이 있습니다. 1 채널을 입력으로하여 텍스처를 가지고 있지만 vec4로 샘플링하면 vec4 (RED, 0.0, 0.0, 1.0)와 같습니다.

질감에 약간의 차이가 있습니다. .는 OpenGL 4.4 사양, 섹션 15.2 (쉐이더 실행)에서

, PP 262 - 당신의 조각 셰이더의 출력이 부동 인 경우 http://www.opengl.org/registry/doc/glspec44.core.pdf

기본적으로

When a fragment shader terminates, the value of each active user-defined output variable is written to components of the fragment color output to which it is bound. The set of fragment color components written is determined according to the variable’s data type and component index binding, using the mappings in table 11.1 [pp. 340].

은, 쓸 것입니다 텍스처의 x (빨강) 성분. y (초록색), z (파란색) 또는 w (알파) (RGBA 텍스처가 있다고 가정)에 쓰도록 지정하려면 레이아웃 한정자 (예 : 레이아웃 (구성 요소 = 1) float 색상,) .

관련 문제