glprogramstringarb gl_invalid_operation을 일으키거나 조각 프로그램을 도와줍니다
문제
나는 질감을 취하고 두 값 사이에서 텍셀을 클램핑하는 조각 프로그램을 작성하려고합니다. 즉, 최소값이 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)에 할당 할 수는 없다고 생각합니다.