2016-05-26 10 views
1

Neu bei OpenGL und GLSL.Vertex Texture Fetch (Texture lesen im Vertex Shader)

Ich verwende OpenGL ES 3.0 und meine GLSL Version #version 300 es.

Ich möchte Pixel (ARGB-Daten) an jeder Position in meinem Vertex Shader (Vertex Texture Fetch) bekommen. Ich habe überprüft, dass mein Android-Tablet Vertex Texture Fetch unterstützt.

Jetzt gehe ich in der Textur (Bild) und Texturkoordinaten an den Vertex-Shader und

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

Ist dies der richtige Weg ausführen oder soll ich GL_POINTS verwenden. wenn ich GL_POINTS verwende, wie man die Textur couordinate?

können Sie alle Beispiele/Beispielcode bereitstellen, die einen vollständigen Pixel lesen (ARGB) im Vertex-Shader.

Anbringen meine Vertex-Shader

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; 
}; 

Meine Texturkoordinaten übergeben werden {0.f, 1.f}
{1.f, 1.f} {0.f, 0.f } { 1.f, 0.f}

und der Shader von

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

Antwort

0

einfach erklären einen Sampler ausgelöst wird, und Probe es genau wie üblich. Z.B.

"#version 150\n" 

in vec4 position; 
in vec2 texCoordinate; 

uniform sampler2D texID; 
uniform mat4 modelViewProjection; 

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

Das texCoordinate einem 4D-Vektor von der Textureinheit texID an Position Probe, dass die Verwendung von position vor dem Aufbringen der Model-View-Projektionsmatrix zu stören. Die Art der Geometrie, die Sie zeichnen, macht keinen Unterschied.

+0

Ich habe es mit glGet verifiziert und bekam 16 für GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS –

+2

"Implementierungen können Null Vertex Texture Units deklarieren", [Tabelle 6.31 (Seite 274)] (https://www.khronos.org/registry/gles/specs/ 3.0/es_spec_3.0.4.pdf) sagt der minimale Wert für 'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS' ist 16, nicht Null. Sie könnten an ES 2.0 denken, wo das Minimum Null war ([Tabelle 6.20, Seite 154] (https://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf)). – genpfault

+0

Danke für die Antwort :) mein Ziel ist so leuchtenden Histogrammwert aus der Farbinformation in Vertex-Shader zu berechnen, color = Textur (texid, texcoordinate) wird es alle Pixel in Vertex-Shader zurückkehren? um alle Pixel zu erhalten, sollte ich GL_POINTS verwenden? Ich bin neu zu diesen Dingen @Tommy –

0

gl_Position = vec4 (-1,0 + (Leuchtdichte * 0,00784313725), 0,0, 0,0, 1,0);

Das ist schlau. Es geht nicht Arbeit, aber das ist schlau.

Die Sache, die alle verwirrt, ist, was Sie uns nicht gesagt haben. Dass Sie das Histogramm mithilfe der Überblendung berechnen. Da Sie die Position für jedes Fragment basierend auf der Luminanz berechnen, erhalten Sie eine Menge Überlappung. Und das Mischen fügt einfach alles zusammen und erzeugt so Ihr Histogramm.

FYI: Es ist immer am besten zu erklären, was Sie eigentlich in Ihrer Frage erreichen wollen, anstatt zu hoffen, dass jemand daraus ableiten kann, was Sie zu tun versuchen.

Das wird nicht funktionieren, weil Sie in diesem Fall nur vier Vertices haben. Sie haben viele Fragmente, aber sie werden basierend auf der Interpolation von Ihren 4 Vertices erzeugt. Und Sie können die Position eines Fragments nicht innerhalb eines Fragment-Shaders ändern.

Wenn Sie das tun wollen, was Sie versuchen, müssen Sie immer noch einen Stützpunkt für jedes Texel rendern, das Sie holen.Sie müssen immer noch GL_POINTS verwenden.

+0

Ich habe tatsächlich die Histogrammberechnung von einem Opensource-Projekt verwendet und habe absolut keine Ahnung, wie das Ding funktioniert.Allerdings erhalte ich das Histogramm, wenn ich glreadpixel benutze und die Pixeldaten an den Shader als Attribut weiterleite und mit GLES30 auslöst. glDrawArrays (GLES30.GL_POINT, 0, # keine Pixel); jetzt wollte ich Textur liest im Vertex-Shader zu Glareadpixel zu vermeiden, in dem wie Sie angegeben, ich brauche GL_POINT. In diesem Fall, wie übergebe ich meine Textur-Koordinate, um das gesamte Pixel in Vertex-Shader zu lesen/Vorschlag dafür. –

+0

Dazwischen gibt es eine bessere Methode, um leuchtendes Histogramm in GPU zu berechnen. –

+0

Können Sie auf die bessere Methode zeigen? – 246tNt