大佬教程收集整理的这篇文章主要介绍了如何处理 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,请注明来意。