2016-08-24 2 views
0

Ich versuche, eine Textur zu erhalten, um auf einem Quadrat aus einem Dreiecksfan zu sehen, die Textur ist aus einem Canvas gemacht. Die Hauptfarbe ist nur gelb und eine kleinere Box ist innen gezeichnet, aber die endgültige Textur ist nur solide gelb.Android: Textur zeigt sich als einfarbig

Yellow Quadrat ohne Textur (Bild)

enter image description here

Fragment shadder:

public static final String fragmentShaderCode_TEXTURED = 
       "precision mediump float;" + 
       "varying vec2 v_texCoord;" + 
       "uniform sampler2D s_texture;" + 
       "void main() {" + 
       //"gl_FragColor = vColor;"+ 
       " gl_FragColor = texture2D(s_texture, v_texCoord);" + 
       "}"; 

Texture Generation:

public static int loadGLTexture(String s){ 
    Rect r = new Rect(); 
    ThreadDat.get().paint.getTextBounds(s, 0, 1, r); //get string dimensions, yeilds 8x9 pxls 
    Bitmap bitmap = Bitmap.createBitmap(bestSize(r.width()),bestSize(r.height()), Bitmap.Config.ARGB_8888); 
    //example size is 16x16pxls 
    Log.i("TextureSize", r.width() + " " + r.height()); 
    Canvas c = new Canvas(bitmap); 

    //some temporary test code setting the background yellow 
    //Paint colors are stored per thread, only one right now 
    ThreadDat.get().paint.setARGB(255, 255, 255, 0); 
    c.drawRect(0, 0, c.getWidth(), c.getHeight(), ThreadDat.get().paint); 
    //type the letter, in this case "A" in blue 
    ThreadDat.get().paint.setARGB(255, 0, 0, 255); 
    ThreadDat.get().paint.setTypeface(Typeface.create("Consolas", Typeface.NORMAL)); 
    c.drawText(s.charAt(0) + "", 0, 0, ThreadDat.get().paint); 
    //draw another square that is half width and height, should be Blue 
    c.drawRect(0, 0, c.getWidth()/2, c.getHeight()/2, ThreadDat.get().paint); 
    return loadTexture(bitmap); 
} 

Draw-Code:

@Override 
public void draw() { 
    //clearing any error to check if program has an error 
    GLES20.glGetError(); 
    //get the compiled shader for textured shapes 
    int prgm = MyGLRenderer.getSTRD_TXTR_SHDR(); 
    GLES20.glUseProgram(prgm); 
    //check for new errors and log to logcat (nothing) 
    MyGLRenderer.logError(); 

    //setup projection view matrix 
    float[] scratch = new float[16]; 
    Matrix.setIdentityM(scratch, 0); 
    Matrix.multiplyMM(scratch, 0, MyGLRenderer.getmMVPMatrix(), 0, scratch, 0); 
    //apply translations to matrix 
    Matrix.translateM(scratch, 0, xOffset, yOffset, zOffset); 
    Matrix.setRotateEulerM(scratch, 0, yaw, pitch, roll); 


    //get vPosition variable handle from chosen shader 
    mPosHandle = GLES20.glGetAttribLocation(prgm, "vPosition"); 
    GLES20.glEnableVertexAttribArray(mPosHandle); 

    GLES20.glVertexAttribPointer(mPosHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, 
      false, VERTEX_STRIDE, vertexBuffer); 

    ////pass color data (set to white) 
    //mColorHandle = GLES20.glGetUniformLocation(prgm, "vColor"); 
    //GLES20.glUniform4fv(mColorHandle, 1, color, 0); 


    //use texture0 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    //use texture from -> int textureID = MyGLRenderer.loadGLTexture("A"); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID); 
    //get handel for "uniform sampler2D s_texture;" to set value 
    int txtureHandle = GLES20.glGetUniformLocation(prgm, "s_texture"); 
    GLES20.glUniform1i(txtureHandle, 0); //set s_texture to use binded texture 0 


    //pass in texture coords (u,v/s,t) 
    int textureCoordHndl = GLES20.glGetAttribLocation(prgm, "a_texCoord"); 
    GLES20.glVertexAttribPointer(textureCoordHndl, 2/*size, 2 points per vector*/, 
      GLES20.GL_FLOAT, false, 0, textureBuffer); 

    //pass in the model view projection matrix 
    mMVPMatrixHandle = GLES20.glGetUniformLocation(prgm, "uMVPMatrix"); 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, scratch, 0); 



    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertex_count); 

    GLES20.glDisableVertexAttribArray(mPosHandle); 
    MyGLRenderer.logError(); 
} 

ich die gleichen Koordinate gesetzt, wie verwendet in dieser example:

Vertices für Platz versucht, mit:

{   0, 0, 0, //bottom left 
      0, height, 0, //topLeft 
      width, 0, 0, // bottom Right 
      width, height, 0)}; //topRight 

Textur coords:

 0.0f, 1.0f,  // top left  (V2) 
     0.0f, 0.0f,  // bottom left (V1) 
     1.0f, 1.0f,  // top right (V4) 
     1.0f, 0.0f  // bottom right (V3) 

Similar Issue

+0

Wie die andere Antwort sagt, ist es höchstwahrscheinlich ein Problem mit Ihrer Textur UV. Bitte poste auch deinen Vertex-Shader immer nur den Teil, der das UV sendet, an variierend. – codetiger

+0

[Vertex-Shader] (http://pastebin.com/SybkZXXX) – TheIncgi

Antwort

1

Das klingt wie es ein Problem mit der Textur c gibt oordinates. Da das Ganze gelb ist, würde ich vermuten, dass die v_texCoord immer (0,0) in Ihrem Fragment Shader ist, so dass die erste Textur Pixel wiederholt wird.

Die Textur selbst scheint in Ordnung zu sein, da die Farbe gezeichnet wird. Ohne die Textur würden Sie höchstwahrscheinlich ein schwarzes Rechteck sehen.

Wie auch immer, um solche Probleme zu behandeln, müssen Sie ein wenig erfinderisch im Debuggen, Testen sein. Zum Testen der Koordinaten verwenden Sie gl_FragColor = vec4(v_texCoord.x, v_texCoord.y, .0, 1.0);. Dies sollte ein Farbverlaufsrechteck ausgeben, wobei oben links schwarz ist, oben rechts ist rot, unten links ist grün. Wenn Sie dieses Ergebnis nicht sehen, sind Ihre Texturkoordinaten falsch. In diesem Fall prüfen Sie zunächst, ob der varying vom Vertex-Shader korrekt verbunden ist. Sie können v_texCoord = vec2(1.0, 0.0) im Vertex-Shader verwenden und das Ergebnis sollte ein rotes Rechteck sein (vorausgesetzt, Sie haben noch den vorherigen Test im Fragment-Shader). Wenn das Rechteck rot ist, liegt das Problem höchstwahrscheinlich in Ihren Handles und nicht in den Shadern (andernfalls ist die Abweichung falsch eingestellt. Möglicherweise ist die Benennung nicht korrekt). Überprüfen Sie, was der Wert des Griffs textureCoordHndl ist. Wenn dies ein negativer Wert ist, wurde der Handle nicht verbunden. Dies ist höchstwahrscheinlich auf eine fehlende Übereinstimmung in der Benennung zurückzuführen.

von der Inspektion:

Sie die Freigabe des Attribut für die Textur-Koordinaten fehlen GLES20.glEnableVertexAttribArray(textureCoordHndl);. Denken Sie daran, dass jedes der Attribute aktiviert sein muss, bevor Sie sie verwenden.

+0

Die Zeile im Fragment-Shader-Feld wurde durch Schwarz ersetzt. Ersetzt die Zeile im Vertex-Shader-Feld ist rot wie vorhergesagt. textureCoordHndl ist 1, wenn protokolliert. – TheIncgi

+0

OMG, fehlt Ihnen nur die Aktivierung des Attributs: glEnableVertexAttribArray (txtureHandle)? –

+0

textureCoordHndl und ja! Das hat funktioniert! Vielen Dank! : D (Brief will nicht angezeigt werden, aber kleine blaue Box ist jetzt da) – TheIncgi

Verwandte Themen