2015-08-05 2 views
-1

Я пишу программу просмотра изображений на основе плитки для моего приложения с помощью JOGL. Изображение разделено на сетку плиток. Я обрабатываю текстуры для каждой плитки на основе текущей шкалы масштабирования. Мой каждый код плитка рендеринга выглядит следующим образом:Как получить исходный цвет фрагмента в фрагментном шейдере

double projectedX = ... //will calculate the X location of tile on the screen 
double projectedY = ... //will calculate the Y location of tile on the screen 
double projectedWidth = ... //calculate width of the tile based on scale 
double projectedHeight= ... //calculate height of the tile based on scale 

gl.glTranslated(projectedX, projectedY, 0.0); 
gl.glScaled(scale, scale, 1.0); 

texture.bing(gl); //here, the texture is of tile image which is created in a shared context in background. There are several texture already created one for each tile. 
texture.enable(gl); 

double s2 = iw * (1.0/texture.getWidth()); 
double t2 = ih * (1.0/texture.getHeight()); 

//draw the texture 
gl.glBegin(GL2.GL_QUADS); 
gl.glTexCoord2d(0, 0); 
gl.glVertex2d(0, 0); 
gl.glTexCoord2d(0, t2); 
gl.glVertex2d(0, ih); 
gl.glTexCoord2d(s2, t2); 
gl.glVertex2d(iw, ih); 
gl.glTexCoord2d(s2, 0); 
gl.glVertex2d(iw, 0); 
gl.glEnd(); 
texture.disable(gl); 

Теперь я хочу, чтобы добавить фрагмент шейдера в зрителе для реализации яркости, белые функции балансировки. Для этого в шейдере фрагментов сначала мне нужно получить исходный цвет пикселя текстуры, а затем применить алгоритм коррекции цвета. Но я не уверен, как это сделать. Как получить текущую текстуру и ее текущие координаты пикселей в шейдере фрагмента?

+1

Посмотрите, я бы проголосовал за закрытие этого вопроса. Я не буду, потому что мне не нравится, когда люди делают это со мной. Поэтому я объясню, что не так с вашим вопросом. Формат SO подразумевает, что вы приходите, чтобы задавать вопросы после вы пытались решить его самостоятельно. Ваш вопрос ясно показывает, что вы не пробовали. Вы смотрите пример, как использовать шейдеры в OpenGL, правильно? Так что Google немного, и вы найдете массу ресурсов. Здесь есть место, где можно спросить помощь для конкретных проблем. SO не является учебным рынком. Если вы хотите использовать шейдеры, начните с отказа от устаревшего API OpenGL. –

+0

Я много разбирался в различных учебниках, сайтах сообщества OpenGL, но повсюду они объясняли про простой случай выборки на Texture0 в шейдере фрагментов. Мой случай отличается тем, что у меня есть несколько текстур, и я мог бы получить хороший пример, объясняющий этот случай. Вот почему, в крайнем случае, я поставил вопрос здесь. Как вы думаете, я использую устаревший API OpenGL? не могли бы вы указать мне это? – Amay

+1

Привет, Амай, я бы предложил добавить то, что вы написали в комментарии в своем вопросе. В любом случае, вы должны взглянуть на пример [Hello Triangle] (https://jogamp.org/wiki/index.php/Jogl_Tutorial#Hello_Triangle), чтобы получить первый взгляд на то, что является современным opengl. – elect

ответ

1

Вы используете немедленный режим (glBegin, glEnd, glVertex, ...), который является неэффективным и полностью устаревшим. Даже Quake 2 использует сохраненный режим.

Использование немедленного режима не было бы хорошей идеей, даже если вы нацелились только на OpenGL 1.2. Более того, вас могут беспокоить некоторые незафиксированные и очень старые ошибки, возникающие при смешивании шейдеров с этим режимом рендеринга. Многочисленные драйверы имитируют динамические VBO под капотом с большим или меньшим успехом: s зависит от того, какое оборудование вы используете, но, пожалуйста, используйте, по крайней мере, VBOs.

Используйте некоторый код GLSL для получения «цвета» пикселя, исходящего из текстуры в фрагментаторе: texture2D (mySampler2D_1, gl_TexCoord [0] .st);

texture2D - это встроенная функция, используемая для извлечения конкретного текселя из сэмплера. Объявите единый образец2D на единицу текстуры и используйте glGetUniformLocation + glUniform1. Не забудьте вызвать glActiveTexture и glBindTexture или Texture.bind() для каждого устройства.

Я советую вам посмотреть на это, если вы посмотрите на встроенный входных переменных фрагмента шейдер: https://www.opengl.org/wiki/Built-in_Variable_%28GLSL%29#Fragment_shader_inputs

gl_SampleID может быть полезным в вашем случае.