Opengl es 如何将纹理仅绑定到OpenGLES中的一个对象?
我正在激活要绘制的对象之前的纹理。但纹理会显示在两个对象上。为什么会这样?我应该在第一个要绘制的对象之前解除纹理绑定吗?-我尝试使用glDisable和glBindTexture,但没有效果。 这是我的代码:Opengl es 如何将纹理仅绑定到OpenGLES中的一个对象?,opengl-es,glsl,shader,textures,gldrawarrays,Opengl Es,Glsl,Shader,Textures,Gldrawarrays,我正在激活要绘制的对象之前的纹理。但纹理会显示在两个对象上。为什么会这样?我应该在第一个要绘制的对象之前解除纹理绑定吗?-我尝试使用glDisable和glBindTexture,但没有效果。 这是我的代码: @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT); synchronized (camerObject) { surfaceTextu
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT);
synchronized (camerObject) {
surfaceTextureCamera.updateTexImage();
cameraUpdate = false;
}
vertexBuffer.position(0);
GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
GLES20.glEnableVertexAttribArray(aPositionLocation);
vertexBuffer.position(POSITION_COMPONENT_COUNT);
GLES20.glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
GLES20.glEnableVertexAttribArray(aColorLocation);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]);
GLES20.glUniform1i(textureUnitLocation, 0);
vertexBuffer2.position(0);
GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDETEXTURE, vertexBuffer2);
GLES20.glEnableVertexAttribArray(aPositionLocation);
vertexBuffer2.position(TEXTURE_COMPONENT_COUNT);
GLES20.glVertexAttribPointer(aTextureCoordinatesLocation, TEXTURE_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDETEXTURE, vertexBuffer2);
GLES20.glEnableVertexAttribArray(aTextureCoordinatesLocation);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);
更新
这是我的着色器程序:
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;
varying vec2 v_TextureCoordinates;
varying vec4 v_Color;
void main() {
gl_FragColor = v_Color;
gl_FragColor = texture2D(u_Texture, v_TextureCoordinates);
}
attribute vec4 a_Position;
attribute vec4 a_Color;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
varying vec4 v_Color;
void main() {
v_Color = a_Color;
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = a_Position;
}
OpenGL是一个状态引擎。一旦设置了状态,它将一直保持,直到再次更改,甚至超出帧 在第二个对象之前绑定命名纹理对象,并在绘制第二个对象之后绑定默认纹理对象(0)。
此外,在绘制调用之前启用顶点属性,并在以下操作之后禁用: 对象1
vertexBuffer.position(0);
GLES20.glVertexAttribute指针(位置位置、位置分量计数、GLES20.GL浮点、false、步幅、顶点缓冲区);
vertexBuffer.position(位置分量计数);
GLES20.glvertexattributepointer(颜色位置、颜色分量计数、GLES20.GL浮动、假、步幅、顶点缓冲区);
GLES20.GlenableVertexattributeArray(定位);
GLES20.GlenableVertexAttributeArray(A色定位);
GLES20.GlDrawArray(GLES20.GL_三角形_扇,0,6);
GLES20.GLDisableVertexAttributeArray(位置定位);
GLES20.GLDisableVertexAttributeArray(颜色定位);
目标2:
vertexBuffer2.位置(0);
GLES20.glVertexAttributePointer(位置位置、位置分量计数、GLES20.GL浮动、false、StripTexture、vertexBuffer2);
vertexBuffer2.位置(纹理分量计数);
GLES20.glVertexAttributePointer(ATextureCoordinationsLocation,TEXTURE_COMPONENT_COUNT,GLES20.GL_FLOAT,false,StrativeTexture,vertexBuffer2);
GLES20.GlenableVertexattributeArray(定位);
GLES20.GlenableVertexAttributeArray(ATExtractionsLocation);
GLES20.glUniform1i(结构硝化,0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,纹理[0]);
GLES20.GlDrawArray(GLES20.GL_三角形_扇,0,6);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,0);
GLES20.GLDisableVertexAttributeArray(位置定位);
GLES20.GLDisableVertexAttributeArray(ATextureCoordinationsLocation);
sahder程序始终从纹理读取颜色:
void main(){
gl_FragColor=v_颜色;
gl_FragColor=纹理2D(u_纹理,v_纹理坐标);
}
注意,设置gl\u FragColor
的第一行是无用的,因为gl\u FragColor
在下一行中被覆盖
由于未设置颜色属性(黑色)或从纹理读取的颜色为黑色,因此可以对颜色求和:
void main(){
gl_FragColor=v_颜色+纹理2D(u_纹理,v_纹理坐标);
}
谢谢你的回答。我尝试了你的答案,但纹理仍然绑定到第一个对象。甚至在调用DisableVertexAttributeArray并将纹理绑定到第二个绘制对象之后的默认纹理对象0之后。也许我的着色器程序有问题。有关帮助,请参见UpdateAnks,编辑着色器程序后,纹理不再绑定到第一个对象。我将把它作为一个公认的答案。非常感谢。