glprogramstringarb gl_invalid_operation을 일으키거나 조각 프로그램을 도와줍니다

StackOverflow https://stackoverflow.com/questions/339042

  •  19-08-2019
  •  | 
  •  

문제

나는 질감을 취하고 두 값 사이에서 텍셀을 클램핑하는 조각 프로그램을 작성하려고합니다. 즉, 최소값이 0.2이고 최대 값이 0.6 인 경우 0.2보다 작은 텍셀은 0이되고 0.6보다 큰 텍셀은 1.0이되고 사이의 모든 값은 0에서 1.0으로 매핑됩니다.

glprogramstringarb에 대한 나의 호출은 gl_invalid_operation입니다. 왜 이런 일이 일어나고 있는지 알 수없는 것 같습니다. 도와주세요.

이것은 셰이더를 작성하려는 첫 번째 시도이므로 내가하고있는 일을 완전히 확신하지 못합니다. 내 코드는 다음과 같습니다.

String str = 
   "!!ARBfp1.0\n"+            
   "TEMP R0;\n"+
   "MOV R0.x, fragment.texcoord[1];\n"+
   "ADD R0.w, fragment.texcoord[2].x, -R0.x;\n"+
   "TEX R0.xyz, fragment.texcoord[0], texture[0], 2D;\n"+
   "RCP R0.w, R0.w;\n"+
   "ADD R0.xyz, R0, -fragment.texcoord[1].x;\n"+
   "MUL_SAT result.color.xyz, R0, R0.w;\n"+
   "END\n";

int count = str.Length;

Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glGenProgramsARB(1, out mFragProg);            
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
Gl.glProgramStringARB(Gl.GL_FRAGMENT_PROGRAM_ARB,  Gl.GL_PROGRAM_FORMAT_ASCII_ARB, count, str);
GetGLError("glProgramStringARB");
Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);

그런 다음 사용하려면 다음을 수행합니다.

Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
float max = (mMiddle + (mRange / 2.0f))/65535.0f;
float min = (mMiddle - (mRange / 2.0f))/65535.0f;
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE1_ARB, min);
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE2_ARB, max);
GetGLError("Enable Program for Drawing");

/* 
 * Drawing Code
 */

Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);
도움이 되었습니까?

해결책

실제로 셰이더를 프로그래밍하지는 않았지만 셰이더 컴파일러가 새 라인을 인식하지 못할 수도 있습니까? " n r"을 넣으셨습니까?

편집하다:

자신에게 물어볼 수있는 또 다른 질문은 어떤 언어를 사용하고 있습니까? 문자열은 유니 코드, 즉 16 비트/char에 있습니까? 방금 GlProgramStringArb ()에 전달되는 형식이 ASCII로 설정되어 있음을 알았습니다. 문자열이 실제로 유니 코드 인 경우 문제가 발생합니다.

예를 들어, Java 및 C# 문자열은 유니 코드에 있습니다. ASCII가 아닙니다.

다른 팁

첫째 : ARB_FRAGMENT_PROGRAM에 대해 많이 알지 못하므로 부분적으로 여기에서 추측하고 있습니다.

가장 좋은 옵션은 오류 문자열 (GLGETSTRING (GL_PROGRAM_ERROR_STRING_ARB))을 가져 와서 무엇을 말하는지 확인하는 것입니다.

셰이더를 본 후에는 3 행과 7 행에 잘못된 수의 구성 요소를 사용하는 것 같습니다 (아마도 더). 예를 들어 4 성분 벡터 (Fragment.texCoord [1])를 스칼라 필드 (R0.x)에 할당 할 수는 없다고 생각합니다.

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