glProgramStringARB, вызывающий GL_INVALID_OPERATION .... или Помощь с фрагментными программами - PullRequest
0 голосов
/ 04 декабря 2008

Я пытаюсь написать фрагментную программу, которая будет брать текстуру и фиксировать тексели между двумя значениями. То есть, если минимальное значение равно 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);

Ответы [ 2 ]

1 голос
/ 04 декабря 2008

Я действительно не программировал никаких шейдеров, но, может быть, шейдерный компилятор не распознает новую строку? Вы пытались поставить "\ n \ r"?

EDIT:

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

Например, строки JAVA и C # находятся в UNICODE. не ASCII.

0 голосов
/ 04 декабря 2008

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

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

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

...