Matrix 在OpenGL ES中不使用矩阵就可以使用纹理吗?
我正在学习OpenGL ES并使用Mehta编写的《移动游戏和图形开发的精益OpenGL ES》一书。他首先展示了如何构建一个简单的项目,然后添加了正交矩阵,然后是3D,最后他解释了如何将这一切与纹理一起使用。我想知道是否可以使用没有矩阵的纹理。我必须说,我试过了,程序没有崩溃,但纹理完全分散和无序-好像顶点数据是错误的。所以我的第一个问题是,这在理论上是否可能 更新1 下面的代码表示能够在纹理上显示摄影机预览的应用程序。使用矩阵可以很好地工作,但如果不使用矩阵,屏幕会显示如图所示 这是纹理顶点着色器和纹理片段着色器Matrix 在OpenGL ES中不使用矩阵就可以使用纹理吗?,matrix,opengl-es,textures,opengl-es-2.0,Matrix,Opengl Es,Textures,Opengl Es 2.0,我正在学习OpenGL ES并使用Mehta编写的《移动游戏和图形开发的精益OpenGL ES》一书。他首先展示了如何构建一个简单的项目,然后添加了正交矩阵,然后是3D,最后他解释了如何将这一切与纹理一起使用。我想知道是否可以使用没有矩阵的纹理。我必须说,我试过了,程序没有崩溃,但纹理完全分散和无序-好像顶点数据是错误的。所以我的第一个问题是,这在理论上是否可能 更新1 下面的代码表示能够在纹理上显示摄影机预览的应用程序。使用矩阵可以很好地工作,但如果不使用矩阵,屏幕会显示如图所示 这是纹理顶点
attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
void main()
{
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = a_Position;
}
纹理加载程序
public class TextureHelper {
public static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;
public static int loadTexture() {
final int[] textureObjectsId = new int[1];
GLES20.glGenTextures(1, textureObjectsId, 0);
if (textureObjectsId[0] == 0 ) {
return 0;
}
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureObjectsId[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
return textureObjectsId[0];
地点和制服
public class TextureShaderProgram extends ShaderProgram {
private final int uTextureUnitLocation;
// Attribute locations
private final int aPositionLocation;
private final int aTextureCoordinatesLocation;
public TextureShaderProgram(Context context) {
super(context, R.raw.texture_vertex_shader, R.raw.texture_fragment_shader);
uTextureUnitLocation = GLES20.glGetUniformLocation(program, U_TEXTURE_UNIT);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
aTextureCoordinatesLocation = GLES20.glGetAttribLocation(program, A_TEXTURE_COORDINATES);
}
public void setUniforms(int textureId) {
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glUniform1i(uTextureUnitLocation, 0);
}
public int getPositionAttributeLocation() {
return aPositionLocation;
}
public int getTextureCoordinatesAttributeLocation() {
return aTextureCoordinatesLocation;
}
}
顶点数据(三角形风扇)
你还需要更多吗?请留下评论,以便我可以在需要时发布其余内容。您通常需要某种形式的变换来设置场景中顶点的动画。这几乎总是一个矩阵,因为它们可以有效地表示任何需要的变换,但不一定是这样
纹理坐标本身很少被矩阵修改-通常纹理在模型上是“固定”的,因此坐标只通过顶点着色器而不进行修改 好吧,理论上这是可能的。关于如何使用它,你有现成的例子吗?因为在我的项目中,除了纹理部分,我把所有的东西都省略了,正如我所说的,纹理矩形看起来完全变形了。有什么不同和特殊的方法来做吗?查看我的更新,也许他们会清除更多请上传屏幕截图,说明您在屏幕上看到了什么,以及如何在应用程序中设置代码。着色器不太可能是这里的问题。请阅读
步幅
计算不正确。您需要将所有组件的浮点值之和乘以一个浮点值大小,但现在右括号的位置不正确,因此只会乘以纹理坐标组件计数。谢谢您的帮助。成功了!祝您今天过得愉快!!!
public class TextureShaderProgram extends ShaderProgram {
private final int uTextureUnitLocation;
// Attribute locations
private final int aPositionLocation;
private final int aTextureCoordinatesLocation;
public TextureShaderProgram(Context context) {
super(context, R.raw.texture_vertex_shader, R.raw.texture_fragment_shader);
uTextureUnitLocation = GLES20.glGetUniformLocation(program, U_TEXTURE_UNIT);
aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
aTextureCoordinatesLocation = GLES20.glGetAttribLocation(program, A_TEXTURE_COORDINATES);
}
public void setUniforms(int textureId) {
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glUniform1i(uTextureUnitLocation, 0);
}
public int getPositionAttributeLocation() {
return aPositionLocation;
}
public int getTextureCoordinatesAttributeLocation() {
return aTextureCoordinatesLocation;
}
}
public class Table {
private static final int POSITION_COMPONENT_COUNT = 2;
private static final int TEXTURE_COORDINATES_COMPONENT_COUNT = 2;
private static final int STRIDE = (POSITION_COMPONENT_COUNT + TEXTURE_COORDINATES_COMPONENT_COUNT * BYTES_PER_FLOAT);
private static final float[] VERTEXDATA = {
0f, 0f, 0.5f, 0.5f, //middle
-0.5f, -0.8f, 1f, 0.1f,//bottom left
0.5f, -0.8f, 1f, 0.9f, //bottom right
0.5f, 0.8f, 0f, 0.9f,//top right
-0.5f, 0.8f, 0f, 0.1f, // top left
-0.5f, -0.8f, 1f, 0.1f, // bottom left
};