OpenGL es 2.0 рисует линию красным цветом

У меня есть код шейдера, как показано ниже:

static const char s_v_shader[] =
"attribute vec4 vPosition; \n"
"attribute vec2 my_Texcoor;     \n"
"uniform   mat4 u_TransMatrix;   \n"
"varying vec2 vTexcoor;         \n"
"void main() \n"
"{ \n"
"  vTexcoor = my_Texcoor;       \n"
" gl_Position = u_TransMatrix*vPosition; \n"
"} \n";

static const char s_f_shader[] =
"precision mediump float;\n"
"uniform sampler2D my_Sampler;                    \n"
"varying vec2 vTexcoor;                           \n"

"void main() \n"
"{ \n"
" vec4 tex = texture2D(my_Sampler, vTexcoor);    \n"
"  gl_FragColor = tex;                            \n"
//" gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n"
"} \n";

Я хочу нарисовать линию на этой текстуре и заполнить ее красным цветом. Я могу нарисовать линию, но цвет всегда черный.

Пожалуйста, помогите мне раскрасить линию красным, желтым или зеленым цветом.


person Mohan Kumar    schedule 18.11.2016    source источник
comment
Пожалуйста, есть кто-нибудь? Я застрял полностью. Кто-нибудь может мне помочь, пожалуйста? Я знаю, что без посторонней помощи я не могу прогрессировать   -  person Mohan Kumar    schedule 18.11.2016


Ответы (3)


Вы не можете рисовать на текстуру. Вы можете рисовать в FBO (объект кадрового буфера), к которому прикреплена текстура.

Для этого вам просто нужно сгенерировать новый буфер кадра GLuint bufferID; glGenFramebuffers(1, &bufferID);, затем вам нужно связать буфер и прикрепить к нему текстуру glBindFramebuffer(GL_FRAMEBUFFER, bufferID) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0). Теперь вы можете нормально рисовать в этот буфер, используя свои команды для рисования линии. В этом случае вообще не нужно использовать текстуру в шейдере, нужно только вывести цвет. Но это отрисовывает только текстуру, если вам нужно ее показать, то вам нужно будет привязать свой основной буфер и использовать шейдер с текстурой и нарисовать полноэкранный прямоугольник с имеющейся у вас текстурой.

С другой стороны, если вы хотите нарисовать только текстуру и линию над ней, вам нужно 2 вызова отрисовки. Сначала нарисуйте текстуру фона, нарисовав прямоугольник с текстурой в шейдере. Затем нарисуйте линию с помощью шейдера, который принимает только цвет, без текстур.

person Matic Oblak    schedule 18.11.2016
comment
Спасибо Матич. Но в моем случае текстура используется в шейдере для рендеринга видео с камеры. Итак, поверх камеры мне нужно рисовать линии и раскрашивать их. - person Mohan Kumar; 18.11.2016
comment
И это объясняется во второй процедуре. Вам нужен дополнительный вызов отрисовки с шейдерами, которые не включают текстуру. - person Matic Oblak; 18.11.2016
comment
Пожалуйста, помогите мне с фрагментом кода Matic. Я полностью заблокирован. - person Mohan Kumar; 18.11.2016
comment
Кумар, это уже твой второй вопрос по этой же проблеме, и кажется, что единственное усилие с твоей стороны - это помощь, помощь. Помощь! ПОМОЩЬ!!! Пожалуйста, есть кто-нибудь? Я полностью застрял. В обоих случаях вы предоставили недостаточно кода, чтобы кто-нибудь мог увидеть, что именно вы делаете, или помочь вам в любом случае. Уже в предыдущем вопросе я показал вам, как ввести цвет в шейдер и как вывести этот цвет. Покажите шейдер, который вы используете для линии, а также покажите код процедуры рисования. - person Matic Oblak; 18.11.2016
comment
Жалко Матика. Я могу опубликовать свой частичный код и немного объяснить, где я застрял. - person Mohan Kumar; 18.11.2016
comment
Matic, я разместил частичный код, извините, я должен был сделать это раньше... - person Mohan Kumar; 18.11.2016

person    schedule
comment
Для этого вам нужен другой шейдер. Он должен быть похож на тот, что у вас есть, но удалите из него семплер и замените его униформой vec4, как описано в предыдущем вопросе, который вы задали. Нет в коде, создайте обе программы, поэтому вместо programHandle у вас будет textureProgramHandle и lineProgramHandle. Прежде чем вы начнете выполнять вызовы для фонового вызова, вызовите glUseProgram(textureProgramHandle); и перед тем, как начать строки, вызовите glUseProgram(lineProgramHandle);. Обратите внимание, что все униформы и атрибуты должны быть отправлены ОБОИМ шейдерам. - person Matic Oblak; 18.11.2016
comment
Что происходит сейчас, так это то, что вы все еще используете шейдер для фона, который ожидает текстуру, а не сплошной цвет. - person Matic Oblak; 18.11.2016
comment
@Matic: я создал еще одну шейдерную программу. Как вы предполагаете, у меня есть похожие вершинные и фрагментные шейдеры, но в фрагментном шейдере я заменил сэмплер на юниформ-переменную vec4. В цикле while после рендеринга видео я использую glUseProgram(lineProgramHandle), но отображается только кадр потокового видео (только один кадр не является непрерывным потоком). Я не могу получить управление для lineProgramHandle. переключение между программами здесь не работает. - person Mohan Kumar; 21.11.2016
comment
glGetUniformLocation(lineProgramHandle,uniformColor); всегда терпит неудачу. Я создаю новую программу только для фрагментного шейдера. Декларация: static const char s_f_shader_new[] =uniform lowp vec4uniformColor;\nvariablevec2vTexcoor_new; \n void main() \n { \n gl_FragColor = uniformColor; \п } \п; - person Mohan Kumar; 21.11.2016
comment
Итак, второму шейдеру нужно скомпилировать фрагментный шейдер, а затем связать фрагментный шейдер и вершинный шейдер из предыдущей программы. Чтобы получить местоположения / дескрипторы, вам нужно сначала использовать правильную программу. В основном убедитесь, что все вызовы, связанные со вторым шейдером, выполняются после того, как этот шейдер используется. - person Matic Oblak; 21.11.2016
comment
@Matic Я скомпилировал фрагментный шейдер и прикрепил его к предыдущей программе. Но до сих пор не вижу эффекта. можете ли вы поделиться фрагментом кода примера или любыми ссылками на код, где реализованы аналогичные требования. - person Mohan Kumar; 21.11.2016
comment
@Matic У меня есть texture2D, сопоставленный с gl_FragColor. После того, как я начал использовать шейдерную программу, текстура отображается на дисплее. Я хочу нарисовать красную линию на текстуре. Я могу нарисовать линию, но не могу ее раскрасить в openGLes 2.0. Любая ссылка или помощь - person Mohan Kumar; 22.11.2016
comment
Мой мозг исчерпал себя, пытаясь сделать многое, но без прорыва. Кто-нибудь, спасите меня с кодом для обмена между двумя программами шейдеров. - person Mohan Kumar; 22.11.2016
comment
Не могли бы вы просто опубликовать код, который вы используете для рисования. - person Matic Oblak; 22.11.2016

person    schedule
comment
@Matic: пожалуйста, прочитайте код функции main(). У меня есть две шейдерные программы. Вторая шейдерная программа, которую я использую в цикле while(1). - person Mohan Kumar; 22.11.2016
comment
@Matic, пожалуйста, дайте мне знать, если вам нужна дополнительная информация - person Mohan Kumar; 23.11.2016
comment
@Matic У вас была возможность заглянуть в мой код? Не могли бы вы предоставить любую ссылку, которая использует программу переключения шейдеров. Это должно быть большим подспорьем для меня. Спасибо - person Mohan Kumar; 23.11.2016