2008-10-24 2 views
2

이미지 데이터에 영향을 미치지 않고 조작하고 싶은 텍스처를 표시하고 있습니다. 텍셀 값을 클램프하여 낮은 값 아래의 값이 0이되고 상위 값보다 높은 값이 0이되고 그 사이의 값이 0에서 1까지 선형으로 매핑됩니다.OpenGL에서 텍스처 매핑 색상

원래 내 이미지를 표시하려면 glDrawPixels를 사용하고있었습니다. 그리고 위의 문제를 해결하기 위해 glPixelMap을 사용하여 컬러 맵을 작성했습니다. 이것은 아름답게 작동했습니다. 그러나 성능상의 이유로 이미지를 표시하기 위해 텍스처를 사용하기 시작했습니다. glPixelMap 접근 방식은 더 이상 작동하지 않습니다. 글쎄 그 접근 방식이 효과가 있지만 작동시키지 못했습니다.

그런 다음 glPixelTransfer를 사용하여 비늘과 바이어스를 설정하려고 시도했습니다. ' 이것은 첫 번째 패스에서 일종의 효과 (원하는 것은 아님)가있는 것으로 보였지만 위/아래 구속 조건을 변경하면 아무런 영향이 표시되지 않았습니다.

그런 다음 조각 쉐이더가 작동한다고 들었습니다. 그러나 glGetString (GL_EXTENSIONS) 호출 후, GL_ARB_fragment_shader가 지원되지 않는다는 것을 알았습니다. 또한 glCreateShaderObjectARB를 호출하면 null 참조 예외가 발생합니다.

그래서 지금 나는 실종 상태입니다. 어떻게해야합니까? 도와주세요.


내가 시도 할 수있는 것은 무엇이든지 시도해 볼 수 있습니다. 공급 업체는 Intel이고 렌더러는 Intel 945G입니다. 불행하게도 마더 보드에 통합 된 그래픽 카드에만 국한되어 있으며 gl 1.4 만 있습니다.

지금까지 답변 해 주셔서 감사합니다.

답변

2

꽤 오래된 그래픽 카드가 아니라면 조각 쉐이더를 지원하지 않는 것이 놀랍습니다. this을 사용하여 이중 확인을 시도해 보시기 바랍니다.

또한 최대 값보다 큰 값을 0으로 설정 하시겠습니까? 아마도 당신은 1을 의미했을까요? 당신이 1이 아니라 0이 아니라면, 당신이 묻고있는 일을하는 데 오랜 바람을 피울 수있는 방법입니다.

압축 된 대답은 여러 개의 렌더링 패스를 사용한다는 것입니다. 먼저 이미지를 표준 밝기로 렌더링합니다. 그런 다음 빼기 혼합 (look up glBlendEquation)을 사용하여 최소값을 뺍니다. 그런 다음 첨가제 블렌딩을 사용하여 모든 것을 1/(최대 - 최소)까지 곱합니다 (여러 번 통과해야 할 수도 있음).

정말로이 작업을 수행하려면 그래픽 카드로 GL_VENDORGL_RENDERER을 게시하십시오.

편집 : 흠. Intel 945G에는 ARB_fragment_shader이 없지만 ARB_fragment_program을 가지고 있으며 트릭을 수행합니다.

(내가 아마 도청 상관 없음 그래서 쓴 이후하지만 시간이 지났는데)

!!ARBfp1.0 
ATTRIB tex = fragment.texcoord[0] 
PARAM cbias = program.local[0] 
PARAM cscale = program.local[1] 
OUTPUT cout = result.color 

TEMP tmp 
TXP tmp, tex, texture[0], 2D 
SUB tmp, tmp, cbias 
MUL cout, tmp, cscale 

END 

당신과 같이 OpenGL을 에이로드의 모양은 당신의 조각 코드 :

GLuint prog; 
glEnable(GL_FRAGMENT_PROGRAM_ARB); 
glGenProgramsARB(1, &prog); 
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog); 
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src); 
glDisable(GL_FRAGMENT_PROGRAM_ARB); 

그런 다음 지오메트리를 렌더링하기 전에 다음을 수행하십시오.

glEnable(GL_FRAGMENT_PROGRAM_ARB); 
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog); 
colour4f cbias = cmin; 
colour4f cscale = 1.0f/(cmax-cmin); 
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a); 
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a); 

//Draw your textured geometry 

glDisable(GL_FRAGMENT_PROGRAM_ARB); 
0

GL_ARB_fragment_program 확장이 지원됩니다.이 확장은 ASM 스타일 조각 프로그램을 지원합니다. 그것은 OpenGL 1.4에서 지원되어야합니다.

+0

GL_ARB_fragment_program이 지원됩니다. –

-1

OpenGL의 고대 버전을 사용하는 것은 정말 불행합니다. 카드로 업그레이드 할 수 있습니까?

더 현대적인 OGL 2.x는 GLSL이 제공하는 프로그램과 정확히 일치합니다. 큰 문서는 여기에서 찾을 수 있습니다 :

OpenGL Documentation

OpenGL Shading Langauge

+1

1.4로 제한된다고 말하면 1.4로 제한됩니다. 그가 가질 수없는 것으로 유혹하는 것은 평범한 의미 일뿐입니다. – mmr

관련 문제