Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 动画纹理坐标不工作_Android_Opengl Es 2.0_Glsles_Rajawali - Fatal编程技术网

Android 动画纹理坐标不工作

Android 动画纹理坐标不工作,android,opengl-es-2.0,glsles,rajawali,Android,Opengl Es 2.0,Glsles,Rajawali,我正在努力学习GLSL ES,这样我就可以将我的一堆动画从CPU卸载到GPU。我的问题是创建一个使用精灵表的简单动画着色器。着色器根本不使用灯光,我只是显示完整的纹理值以保持基本效果。我选择的OpenGL ES框架是Rajawali,因此我的一些值和参数是从这些类中提取的 当我将此着色器与isAnimated=false一起使用时,纹理将按预期应用。但是,当isAnimated=true时,模型将全部为黑色,就好像没有应用纹理一样 我能够确认顶点和片段着色器正在将ifdef ANIMATED评估

我正在努力学习GLSL ES,这样我就可以将我的一堆动画从CPU卸载到GPU。我的问题是创建一个使用精灵表的简单动画着色器。着色器根本不使用灯光,我只是显示完整的纹理值以保持基本效果。我选择的OpenGL ES框架是Rajawali,因此我的一些值和参数是从这些类中提取的

当我将此着色器与
isAnimated=false
一起使用时,纹理将按预期应用。但是,当
isAnimated=true
时,模型将全部为黑色,就好像没有应用纹理一样

我能够确认顶点和片段着色器正在将
ifdef ANIMATED
评估为
true
,因此似乎是我的纹理坐标修改引起了问题

"       vTextureCoord.s = mod(uCurrentFrame, uNumTileRows) * uTileSize;" +
"       vTextureCoord.t = uTileSize * floor(uCurrentFrame  / uNumTileRows);\n" +
非常感谢您的帮助

以下是我完整的非工作着色器类:

package rajawali.materials;

import android.opengl.GLES20;

public class SimpleAnimatedMaterial extends AMaterial {
protected static final String mVShader = 
    "uniform mat4 uMVPMatrix;\n" +

    "#ifdef ANIMATED\n" +
    "uniform float uCurrentFrame;\n" +
    "uniform float uTileSize;\n" +
    "uniform float uNumTileRows;\n" +
    "#endif\n" +

    "attribute vec4 aPosition;\n" +
    "attribute vec2 aTextureCoord;\n" +
    "attribute vec4 aColor;\n" +

    "varying vec2 vTextureCoord;\n" +
    "varying vec4 vColor;\n" +      

    "void main() {\n" +
    "   gl_Position = uMVPMatrix * aPosition;\n" +
    "   #ifdef ANIMATED\n" +
    "       vTextureCoord.s = mod(uCurrentFrame, uNumTileRows) * uTileSize;" +
    "       vTextureCoord.t = uTileSize * floor(uCurrentFrame  / uNumTileRows);\n" +
    "   #else\n" +
    "       vTextureCoord = aTextureCoord;\n" +
    "   #endif\n" +
    "   vColor = aColor;\n" +
    "}\n";

protected static final String mFShader = 
    "precision mediump float;\n" +

    "uniform sampler2D uDiffuseTexture;\n" +

    "varying vec2 vTextureCoord;\n" +
    "varying vec4 vColor;\n" +

    "#ifdef ANIMATED\n" +
    "   uniform float uTileSize;\n" +
    "   uniform float uNumTileRows;\n" +
    "#endif\n" +

    "void main() {\n" +
    "#ifdef TEXTURED\n" +
    "   #ifdef ANIMATED\n" +
    "       vec2 realTexCoord = vTextureCoord + (vTextureCoord / uNumTileRows);" +
    "       gl_FragColor = texture2D(uDiffuseTexture, realTexCoord);\n" +
    "   #else\n" +
    "       gl_FragColor = texture2D(uDiffuseTexture, vTextureCoord);\n" +
    "   #endif\n" +
    "#else\n" +
    "   gl_FragColor = vColor;\n" +
    "#endif\n" +
    "}\n";

protected int muCurrentFrameHandle;
protected int muTileSizeHandle;
protected int muNumTileRowsHandle;

protected int mCurrentFrame;
protected float mTileSize;
protected float mNumTileRows;
protected boolean mIsAnimated;

public SimpleAnimatedMaterial() {
    this(false);
}

public SimpleAnimatedMaterial(boolean isAnimated) {
    this(mVShader, mFShader, isAnimated);
}

public SimpleAnimatedMaterial(String vertexShader, String fragmentShader, boolean isAnimated) {
    super(vertexShader, fragmentShader, NONE);
    mIsAnimated = isAnimated;
    if(mIsAnimated) {
        mUntouchedVertexShader = "\n#define ANIMATED\n" + mUntouchedVertexShader;
        mUntouchedFragmentShader = "\n#define ANIMATED\n" + mUntouchedFragmentShader;
    }
    setShaders(mUntouchedVertexShader, mUntouchedFragmentShader);
}

@Override
public void useProgram() {
    super.useProgram();
}

@Override
public void setShaders(String vertexShader, String fragmentShader)
{
    super.setShaders(vertexShader, fragmentShader);
    muCurrentFrameHandle = getUniformLocation("uCurrentFrame");
    muTileSizeHandle = getUniformLocation("uTileSize");
    muNumTileRowsHandle = getUniformLocation("uNumTileRows");
}

public void setCurrentFrame(int currentFrame) {
    mCurrentFrame = currentFrame;
    GLES20.glUniform1f(muCurrentFrameHandle, mCurrentFrame);
}

public void setTileSize(float tileSize) {
    mTileSize = tileSize;
    GLES20.glUniform1f(muTileSizeHandle, mTileSize);
}

public void setNumTileRows(int numTileRows) {
    mNumTileRows = numTileRows;
    GLES20.glUniform1f(muNumTileRowsHandle, mNumTileRows);
}

}

我注意到您在几行中缺少了一些换行符。虽然我不认为只是这个,但如果我能记得的话,过去它给我带来了麻烦


您将使用的纹理坐标的边界是什么(realTexCoord)。它看起来可能会比1大,这对我来说通常意味着只有清晰的颜色才会显示出来

如果我尝试将相同的命名统一指定给顶点着色器和片段着色器,我会得到一个错误“统一***精度不同”。你的着色器也会出现这种情况吗?它不会给我带来任何错误,这让我非常沮丧!我想知道这是否是因为你没有构造一些参数的超类。边界是完整的纹理表0,0到1,1。我会再检查一遍,谢谢。