GLProgramStringarb, вызывая GL_INVALID_OPERATION ... или помощь в программах фрагментов

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

  •  19-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать программу фрагментов, которая возьмет на себя текстуру и зажимает Texels между двумя значениями. То есть, если значение min, скажем, 0,2, а максимальное значение составляет 0,6, любое Texel менее 0,2 станет 0, любой Texel, превышающий 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"?

РЕДАКТИРОВАТЬ:

Еще один вопрос, который вы можете задать себе, - какой язык вы используете? Строки в Unicode, то есть 16-битный/чар? Я только что заметил, что формат, который вы передаете в GLProgramStringarb (), установлен на ASCII. Если строка действительно Unicode, то это вызовет проблемы.

Например, струны Java и C# находятся в Unicode. не ASCII.

Другие советы

Во -первых: я не знаю много о arb_fragment_program, поэтому я частично догадаюсь здесь.

Лучшим вариантом было бы получить строку ошибки (GLGETSTRING (GL_PROGRAM_ERROR_STRING_ARB)) и посмотреть, что это говорит вам.

Посмотрев на шейдер, вы, кажется, используете неправильное количество компонентов в строках 3 и 7 (и, вероятно, еще). Например, я не думаю, что вы можете назначить 4-компонентный вектор (fragment.texcoord [1]) на скалярное поле (r0.x).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top