문제

이미지 데이터에 영향을 미치지 않고 조작하고 싶은 텍스처를 표시하고 있습니다. 낮은 값 미만의 모든 것이 0이되도록 Texel 값을 클램핑 할 수 있고, 상위 값 위의 모든 것이 0이되고, 사이의 모든 것이 0에서 1까지 선형 매핑됩니다.

원래 내 이미지를 표시하기 위해 GlDrawPixels를 사용하고있었습니다. 위의 문제를 해결하기 위해 Glpixelmap을 사용하여 컬러 맵을 만들 것입니다. 이것은 아름답게 작동했습니다. 그러나 성능의 이유로 텍스처를 사용하여 이미지를 표시하기 시작했습니다. glpixelmap 접근법은 더 이상 작동하지 않는 것 같습니다. 글쎄, 그 접근법은 효과가있을 수 있지만 나는 그것을 작동시킬 수 없었습니다.

그런 다음 glpixeltransfer를 사용하여 스케일과 바이어스를 설정했습니다. 이것은 첫 번째 패스에서 어떤 종류의 효과 (반드시 원하는 것은 아님)를 갖는 것처럼 보였지만, 상단 및 하부 제약 조건이 변경되면 효과가 보이지 않았다.

그런 다음 Fragment Shaders가 작동 할 것이라고 들었습니다. 그러나 glgetstring (GL_EXTENSIONS)에 전화 한 후, 나는 GL_ARB_FRAGMENT_SHADER가 지원되지 않았다는 것을 알았습니다. 또한 GlcreateShaderobjectarb에 대한 호출은 NullReferenceException을 유발합니다.

그래서 지금 나는 잃어 버렸다. 어떻게해야합니까? 도와주세요.


내가 기꺼이 시도 할 수있는 것은 무엇입니까? 공급 업체는 인텔이고 렌더러는 Intel 945G입니다. 불행히도 마더 보드에 통합 된 그래픽 카드에 국한되어 있으며 GL 1.4 만 있습니다.

지금까지 귀하의 답변에 감사드립니다.

도움이 되었습니까?

해결책

꽤 오래된 그래픽 카드가 없다면 Fragment Shader 지원이 없다는 것은 놀라운 일입니다. 사용하는 것이 좋습니다 이것.

또한 최대 값보다 0 이상을 원하십니까? 아마도 당신은 1을 의미합니까? 당신이 1을 의미하고 0이 아닌 것을 의미한다면, 당신이 요구하는 일을하는 데 꽤 오래 가득한 방법입니다.

요약 된 대답은 여러 렌더링 패스를 사용한다는 것입니다. 먼저 이미지를 정상 강도로 렌더링합니다. 그런 다음 빼기 블렌딩 (Glblendequation을 찾아보기)을 사용하여 최소 값을 빼냅니다. 그런 다음 첨가제 블렌딩을 사용하여 모든 것을 1/(Max-Min) (여러 패스가 필요할 수 있음)를 곱합니다.

정말로이 작업을 원한다면 다시 게시하십시오. GL_VENDOR 그리고 GL_RENDERER 그래픽 카드 용.

편집하다: 흠. 인텔 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);

다른 팁

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

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

보다 현대적인 OGL 2.X의 경우, 이것은 정확히 GLSL을위한 프로그램입니다. 훌륭한 문서는 여기에서 찾을 수 있습니다.

Opengl 문서

Opengl Shading Langauge

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top