2015-05-25 4 views
0

Я новичок в концепциях шейдеров, и я пытаюсь реализовать спрайт 8x8 в OpenGL ES.OpenGl basic Vertex Shader

Я хочу, чтобы переместить текстуру в вершинном шейдере, но я не могу понять, как это, мой код может быть неправильным, не стесняйтесь исправлять меня

Если изменить эту строку в вершинном шейдере, текстуры масштаб, но я хочу, чтобы двигаться не масштабируются !:

v_TexCoordinate = a_TexCoordinate*vec2(1.5,1.5); 

Так что я должен применить ADITION, но я не знаю, как это сделать (может быть, есть другой способ)

Vertex шейдер:

uniform mat4 u_MVPMatrix;  // A constant representing the combined model/view/projection matrix.     
uniform mat4 u_MVMatrix;  // A constant representing the combined model/view matrix.    
uniform mat4 u_TextureMatrix; 


attribute vec4 a_Position;  // Per-vertex position information we will pass in.        
attribute vec3 a_Normal;  // Per-vertex normal information we will pass in.  
attribute vec2 a_TexCoordinate; // Per-vertex texture coordinate information we will pass in.  

varying vec3 v_Position;  // This will be passed into the fragment shader.        
varying vec3 v_Normal;   // This will be passed into the fragment shader. 
varying vec2 v_TexCoordinate; // This will be passed into the fragment shader.    

// The entry point for our vertex shader. 
void main()              
{               
// Transform the vertex into eye space.  
    v_Position = vec3(u_MVMatrix * a_Position);     

// Pass through the texture coordinate. 
    v_TexCoordinate = a_TexCoordinate;          

// Transform the normal's orientation into eye space. 
    v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0)); 

// gl_Position is a special variable used to store the final position. 
// Multiply the vertex by the matrix to get the final point in normalized screen coordinates. 
    gl_Position = u_MVPMatrix * a_Position;        
} 

Это моя ничья фикцию

private void drawMagia() 
{ 
    GLES20.glUseProgram(mMagiaProgramHandle); 
    mTextureMatrixHandle = GLES20.glGetUniformLocation(mMagiaProgramHandle, "u_TextureMatrix"); 
    mMagiaTextureCoordinateHandle = GLES20.glGetAttribLocation(mMagiaProgramHandle, "a_TexCoordinate"); 



    mMagiaPositions.position(0);   
    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false, 
      0, mMagiaPositions);   

    GLES20.glEnableVertexAttribArray(mPositionHandle);   


    // Pass in the normal information 
    mMagiaNormals.position(0); 
    GLES20.glVertexAttribPointer(mNormalHandle, mNormalDataSize, GLES20.GL_FLOAT, false, 
      0, mMagiaNormals); 

    GLES20.glEnableVertexAttribArray(mNormalHandle); 

    // Pass in the texture coordinate information 
    mMagiaTextureCoordinates.position(0); 
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 
      0, mMagiaTextureCoordinates); 

    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); 

    // This multiplies the view matrix by the model matrix, and stores the 
    // result in the MVP matrix 
    // (which currently contains model * view). 
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 

    // Pass in the modelview matrix. 
    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0); 

    GLES20.glUniformMatrix4fv(mTextureMatrixHandle, 1, false, mTextureMatrix, 0); 

    // This multiplies the modelview matrix by the projection matrix, and 
    // stores the result in the MVP matrix 
    // (which now contains model * view * projection). 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); 

    // Pass in the combined matrix. 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

    // Pass in the light position in eye space. 
    GLES20.glUniform3f(mLightPosHandle, mLightPosInEyeSpace[0], mLightPosInEyeSpace[1], mLightPosInEyeSpace[2]); 


    // Draw the square. 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6); 
} 
+0

Что вы имеете в виду вы не знаете, как применить дополнение? v_TexCoordinate = a_TexCoordinate + vec2 (-pixelsToMoveX/widthInPixels, -pixelsToMoveY/heightInPixels); Минус для коррекции визуального представления и деления, поскольку координаты текстуры определены в диапазоне [0,1]. –

+0

Я имею в виду, что если я делаю v_TexCoordinate = a_TexCoordinate + vec2 (1.5.1.5); ничего не происходит – D4rWiNS

+1

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

ответ

1

Вы можете добавить некоторые смещения вместо умножения.

v_TexCoordinate = a_TexCoordinate + vec2(1.5,1.5); 

Кроме того, ваша текстура должна быть зажата

+0

Я пробовал, но ничего не происходит точно так же, как текстура – D4rWiNS

+0

Это не совсем правильный ответ, потому что значения X, Y vec2 должны быть меньше 1, но все же действительны – D4rWiNS

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