纹理的使用与绘制三角形冲突,仅显示一个

Jakobimatrix:

我目前正在学习OpenGL(使用Java / Android),直到现在为止,可以使用称为stackoverflow或google(您可能都知道)的网站来解决所有问题。

到目前为止,我仅使用类似方法绘制三角形(带有索引的顶点)。

    // some math here to calculate vertices and indices
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, vertex_stride, vertex_buffer);
    gl.glColor4f(color.r, color.g, color.b, color.a);
    gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, index_buffer_size, GL10.GL_UNSIGNED_SHORT, index_buffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

vertex_buffer保存顶点,index_buffer保存索引。这样可以工作,我可以绘制矩形,圆形,箭头和其他简单形状

现在我想添加一个纹理。我确实遵循了这一点:https : //examples.javacodegeeks.com/android/games/opengl-es/opengl-es-texture-mapping/

它本身也可以工作:

    // once: bitmap to texture conversion
    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    // do some math for the verices and the mapping

    // always: drawing
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_FLOAT, vertex_stride, vertex_buffer);
    gl.glTexCoordPointer(COORDS_PER_TEXTURE_COORD, GL10.GL_FLOAT, 0, texture_buffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, NUM_VERTICES);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

textures [0]持有指向纹理的指针,vertex_buffer再次指向顶点,texture_buffer则将纹理映射到顶点,位图持有一个位图。

现在,如果同时使用两者,我会发现openGL仅绘制纹理。不会显示所有简单形状如果我将应用程序置于背景中,而不是再次置于前景中,则会突然显示所有简单形状,但纹理将变成填充有随机颜色(可能是我绘制的最后一个简单形状的颜色)的矩形如果先绘制简单的形状而不是纹理,则结果不会改变,反之亦然。

我猜测,仅调用gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);简单的形状比都gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);对纹理莫名其妙相撞。

有没有办法将两个都用于同一个“框架”?

也许我需要在Render类的openGL中配置一些东西?

class OpenGLRenderer implements GLSurfaceView.Renderer {

    public OpenGLRenderer(Context c, int screen_width_px, int screen_height_px){
        context = c;
        this.screen_width_px = screen_width_px;
        this.screen_height_px = screen_height_px;
    }


    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig egl_config){
        gl10.glEnable(GL10.GL_TEXTURE_2D);
        gl10.glShadeModel(GL10.GL_SMOOTH);

        gl10.glClearColor(0.5f, 0.5f, 0.0f, 0.5f);
        gl10.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        gl10.glEnable(GL10.GL_DEPTH_TEST);
    }

    @Override
    public void onSurfaceChanged(GL10 gl10, int width, int height){
        screen_height_px = height;
        screen_width_px = width;

        GLES20.glViewport(0,0,width,height);
        float ratio  = (float) width / (float) height;
        gl10.glMatrixMode(GL10.GL_PROJECTION);
        gl10.glLoadIdentity();

        float near = 1.0f;
        float far = -zoom+1;
        float bottom = -1.0f;
        float top = 1.0f;
        float left = -ratio;
        float right = ratio;
        gl10.glFrustumf(left , right , bottom, top, near, far);
    }

    @Override
    public void onDrawFrame(GL10 gl10){

        prepareFrame(gl10);

        // HERE I would call all simple_shapes and Textures in two for loops
    }

    void prepareFrame(GL10 gl10){
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        gl10.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl10.glMatrixMode(GL10.GL_MODELVIEW);
        gl10.glLoadIdentity();
        gl10.glTranslatef(0.0f, 0.0f, zoom);
        gl10.glEnable(GL10.GL_BLEND);
        gl10.glEnable(GL10.GL_TEXTURE_2D);
        gl10.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    }  
}

我认为这是所有相关的代码。我不知道是否应该在此处发布指向(Github)项目的链接,但是如果需要,我也可以创建一个分支并将其链接。

拉比德76:

OpenGL是一个状态引擎。设置状态后,将保留该状态,直到再次更改为止。旧版OpenGL中,必须通过启用二维纹理gl10.glEnable(GL10.GL_TEXTURE_2D);设置此状态后,将保留它。如果启用了二维纹理化并且未提供纹理坐标,则网格的所有纹理坐标属性都必须为默认值(0,0),并且当前绑定纹理在该坐标处的纹理像素将缠绕在整个网格上。

在绘制带有纹理的几何图形之前,必须先启用二维纹理化:

gl10.glEnable(GL10.GL_TEXTURE_2D);
// draw mesh with texture

并且在绘制没有纹理的几何图形之前,必须先禁用二维纹理化:

gl10.glDisable(GL10.GL_TEXTURE_2D);
// draw mesh with color

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从同构三角形集中仅返回一个三角形?

Flutter - 使用 customPainter 在右下角绘制一个三角形

如何仅使用 css 创建一个三角形的 div?

是否可以仅使用CSS制作一个圆角三角形?

glDrawElements仅绘制由索引指定的第一个三角形

Open GL DrawArrays仅绘制一个三角形/直线/点(OpenTK / C#)

webgl试图绘制一个三角形

用OpenGL绘制一个三角形

用数字绘制一个三角形(javascript)

使用一个glDrawArrays命令绘制几个具有不同颜色的三角形

Android:使用xml定义(可绘制)制作一个三角形的按钮

Qt和OpenGL,如果我使用属性,则绘制一个三角形

C#在另一个等边三角形的边上绘制等边三角形

堆叠一个方形DataFrame以仅保留上/下三角形

纹理三角形

根据三个给定的长度在HTML画布中绘制一个三角形

使用递归从星星中创建一个三角形

使用 OpenGL 绘制基本三角形

使用Java绘制三角形

使用gnuplot绘制三角形网格

使用线条填充绘制的三角形

使用递归绘制嵌套的三角形

仅传递三角形的边长是否足以在WebGL中绘制三角形?

在3D中绘制一个三角形到深度缓冲区

如何在xml drawable android中绘制一个矩形内端三角形形状?

在一个绘制的图上,我想知道最大三角形交点的面积

在MapControl(UWP)3d视图上绘制一个三角形

仅使用CSS创建三角形

仅连接一个三角形的边的轮廓检测(几何着色器)