2016-05-26 3 views
1

Новое для Opengl и GLSL.Фрагмент текстуры вершин (текстура, читаемая в вершинном шейдере)

Я использую OpenGL ES 3.0 и моей GLSL версии #Version 300 эс.

Я хочу получить пиксель (данные ARGB) в каждой позиции в моем вершинном шейдере (выбор текстуры вершин). я подтвердил, что мой Android-планшет поддерживает выборку текстур вершин.

Теперь я прохожу в текстуры (изображения) и координаты текстуры в вершинном шейдере и выполнить

GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); 

Является ли это правильный путь или я должен использовать GL_POINTS. Если я использую GL_POINTS, как передать текстуру cooordinate?

Вы могли бы предоставить образцы/примеры кода, которые читают полный пиксель (ARGB) в вершинном шейдере.

прикрепление мой вершинные шейдеры

uniform sampler2D sTexture; 
in vec4 aTextureCoord; 
out vec3 colorFactor; 
vec2 vTextureCoord; 
vec4 tex; 
void main() 
{ 
    vTextureCoord = aTextureCoord.xy; 
    tex = texture(sTexture,vTextureCoord); 
    float luminance = 0.299 * tex.r + 0.587 * tex.g + 0.114 * tex.b; 
    colorFactor = vec3(1.0, 1.0, 1.0); 
    gl_Position = vec4(-1.0 + (luminance * 0.00784313725), 0.0, 0.0,  1.0); 
    gl_PointSize = 1.0; 
}; 

Мои координаты текстуры пройденные {0.f, 1.f}
{1.f, 1.f} {0.f, 0.f } {1.f, 0.f}

, и затенение инициируется

GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); 

ответ

0

Просто объявить пробник и пробуйте его точно в соответствии с обычным. Например.

"#version 150\n" 

in vec4 position; 
in vec2 texCoordinate; 

uniform sampler2D texID; 
uniform mat4 modelViewProjection; 

void main() 
{ 
    gl_Position = modelViewProjection * (position + texture(texID, texCoordinate)); 
} 

Это будет пробовать 4d вектор из блока texID текстуры на месте texCoordinate, используя которые возмутить position перед нанесением матрицы модель-представление-проекции. Тип геометрии, которую вы рисуете, не имеет значения.

+0

Я проверил его с помощью glGet и получил 16 для GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS –

+2

«Реализации могут объявлять единицы нулевой вершинной текстуры», [Таблица 6.31 (страница 274)] (https://www.khronos.org/registry/gles/specs/ 3.0/es_spec_3.0.4.pdf) говорит, что минимальное значение для 'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS' равно 16, а не нулю. Возможно, вы думаете о ES 2.0, где минимум равен нулю ([Таблица 6.20, стр. 154] (https://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf)). – genpfault

+0

Спасибо за ответ :) моей цель состоит в вычислении светового значения гистограммы от цветовой информации в вершинном шейдере так, цвета = текстура (texID, texcoordinate) он будет возвращать каждый пикселы в вершинном шейдере? Чтобы получить каждый пиксел, мне нужно использовать GL_POINTS? Я новичок в этих вещах @Tommy –

0

gl_Position = vec4 (-1.0 + (яркость * 0.00784313725), 0.0, 0.0, 1.0);

Это умный. Это не будет Работа, но это умно.

Вещь, которая сбивает с толку всех, - это то, что вы нам не сказали. То, что вы вычисляете гистограмму с помощью смешивания. Чтобы вы вычислили местоположение для каждого фрагмента на основе яркости, вы получите много перекрытий. И смешивание просто добавляет все вместе, создавая вашу гистограмму.

FYI: Всегда лучше объяснить, что именно вы на самом деле пытаетесь выполнить в своем вопросе, а не надеяться, что кто-то сможет вывести то, что вы пытаетесь сделать.

Это не сработает, потому что в этом случае у вас есть только четыре вершины. У вас много фрагментов, но они будут сгенерированы на основе интерполяции из ваших 4 вершин. И вы не можете изменить положение фрагмента внутри фреймового шейдера.

Если вы хотите делать то, что вы пытаетесь сделать, вам все равно придется отображать одну вершину для каждого текселя, который вы получаете.Вам все равно нужно использовать GL_POINTS.

+0

Я фактически использовал расчет гистограммы из проекта с открытым исходным кодом и понятия не имею, как это работает. Когда я получаю гистограмму, когда я использую glreadpixel и передаю данные пикселя в шейдер в качестве атрибута и запускаю с использованием GLES30. glDrawArrays (GLES30.GL_POINT, 0, #no пикселя); теперь я хотел сделать чтение текстуры в вершинном шейдере, чтобы избежать glreadpixel, в том, что, как вы указали, мне нужно использовать GL_POINT. В этом случае, как мне передать координату текстуры, чтобы прочитать весь пиксель в вершинном шейдере. Вы могли бы предоставить какие-либо образцы/предложение для этого. –

+0

Между ними есть лучший способ вычисления световой гистограммы в графическом процессоре. –

+0

Не могли бы вы указать на лучший метод? – 246tNt

Смежные вопросы