程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何处理 Open GL ES 中的方向变化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何处理 Open GL ES 中的方向变化?

开发过程中遇到如何处理 Open GL ES 中的方向变化的问题如何解决?下面主要结合日常开发的经验,给出你关于如何处理 Open GL ES 中的方向变化的解决方法建议,希望对你解决如何处理 Open GL ES 中的方向变化有所启发或帮助;

我正在尝试 AndroID 版 Open GL 2。到目前为止,我已经能够初始化 GLES20 并在其上绘制一些简单的形状。问题是我找不到有关如何为屏幕方向更改配置 GLES20 的信息,因为现在我在设备旋转后只有黑屏。 GLSurfaceVIEw 甚至可以在屏幕旋转后旋转,还是我必须使用某些矩阵手动进行旋转?

打开 GL 初始化代码:

object OpenGLBuilder {

val vertexshadercode =
    "attribute vec4 vposition;" +
            "voID main() {" +
            "  gl_position = vposition;" +
            "}"

val fragmentshadercode =
    "precision mediump float;" +
            "uniform vec4 vcolor;" +
            "voID main() {" +
            "  gl_Fragcolor = vcolor;" +
            "}"

var mProgram = -1;
init {
    val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexshadercodE)
    val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentshadercodE)

    // create empty OpenGL ES Program
    mProgram = GLES20.glCreateProgram().also {

        // add the vertex shader to program
        GLES20.glAttachShader(it,vertexShader)

        // add the fragment shader to program
        GLES20.glAttachShader(it,fragmentShader)

        // creates OpenGL ES program executables
        GLES20.gllinkProgram(it)
    }
}

fun loadShader(type: Int,shadercode: String): Int {

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    return GLES20.glCreateShader(typE).also { shader ->

        // add the source code to the shader and compile it
        GLES20.glShadersource(shader,shadercodE)
        GLES20.glCompileShader(shader)
    }
}

}

我的形状类:

class Triangle(val triangleCoords: floatArray) {

// Set color with red,green,blue and Alpha (opacity) VALUES
val color = floatArrayOf(0.63671875f,0.76953125f,0.22265625f,1.0f)

private var vertexBuffer: floatBuffer =
    // (number of coordinate values * 4 bytes per float)
    ByteBuffer.allocateDirect(triangleCoords.size * 4).run {
        // use the device harDWare's native byte order
        order(ByteOrder.nativeOrder())

        // create a floating point buffer from the ByteBuffer
        asfloatBuffer().apply {
            // add the coordinates to the floatBuffer
            put(triangleCoords)
            // set the buffer to read the first coordinate
            position(0)
        }
    }
private val COORDS_PER_VERTEX = 3
private var positionHandle = 0
private var mcolorHandle = 0;

private val vertexCount = triangleCoords.size / COORDS_PER_VERTEX
private val vertexStriDe = COORDS_PER_VERTEX * 4

fun draw(program: int) {
    GLES20.gluseProgram(program)

    positionHandle = GLES20.glGetAttribLOCATIOn(program,"vposition").also {
        GLES20.glEnabLevertexAttribarray(it)
        GLES20.glVertexAttribPointer(
            it,COORDS_PER_VERTEX,GLES20.GL_float,false,vertexStriDe,vertexBuffer
        )
    }

    mcolorHandle = GLES20.glGetUniformLOCATIOn(program,"vcolor").also{
        GLES20.gluniform4fv(mcolorHandle,1,color,0)
    }

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES,vertexCount)

    GLES20.gldisabLevertexAttribarray(positionHandlE)
}
}

然后我只是创建和使用这样的形状的单个实例:

object SceneObjects {
    val triangle1 = Triangle(floatArrayOf(
        0f,0.5f,0f,-0.5f,-0.3f,0f
    ))

    val square1 = Square2(floatArrayOf(
        -0.5f,0f
    ))

}

和 GLSurfaceVIEw:

class MyGLSurfaceVIEw(context: Context) : GLSurfaceVIEw(context),GLSurfaceVIEw.Renderer {
    init{
        setEGLContextClIEntVersion(2)
        setRenderer(this)
        // Render the vIEw only when there is a change in the drawing data
        renderMode = GLSurfaceVIEw.RENDERMODE_WHEN_DIRTY
    }

    overrIDe fun onSurfaceCreated(unused: GL10,config: EGLConfig) {
        // Set the BACkground frame color
        GLES20.glClearcolor(0.0f,0.0f,1.0f)
    }

    overrIDe fun onDrawFrame(unused: GL10) {
        // Redraw BACkground color
        SceneObjects.triangle1.draw(OpenGLBuilder.mProgram)
    }

    overrIDe fun onSurfaceChanged(unused: GL10,wIDth: Int,height: int) {
        GLES20.glVIEwport(0,wIDth,height)
    }
}

解决方法

我认为您需要做两件事才能巧妙地处理方向变化。

首先,默认情况下,您的 OpenGL 上下文和所有创建的对象在进入背景时都会被销毁。有一种观点认为,您应该让这种情况发生并添加代码来重新创建所有资源,但如果您希望过上轻松的生活,那么只需使用 setPreserveEGLContextOnPause 就可以了,再也不用担心了。

您可能会想“但这是一个方向改变,我的应用程序没有进入后台”。好吧,默认情况下,Android Activity 会在方向更改后重新启动,这可能会使事情变得一团糟。此行为详细here。您可能希望在清单中为您的活动使用此批次:android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"

大佬总结

以上是大佬教程为你收集整理的如何处理 Open GL ES 中的方向变化全部内容,希望文章能够帮你解决如何处理 Open GL ES 中的方向变化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何处理