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
Благодаря Matic. Но в моя случай текстурата се използва в шейдъра за изобразяване на видео от камерата. Така че отгоре на камерата трябва да начертая линии и да оцветя линиите. - 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 vec4 uniformColor;\n вариращ vec2 vTexcoor_new; \n void main() \n { \n gl_FragColor = uniformColor; \n } \n; - 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