- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在遵循有关如何使用图形创建您自己的 Open GL ES 环境的 Android 教程。除了教程似乎跳过了他们假设我们知道要包含的代码之外,我在让我的应用程序保持打开状态而没有错误消息“不幸的是,MyApp 已停止”五秒后遇到了问题应用程序打开。我不相信这是三角形类造成的,因为我注释掉了三角形对象并尝试再次运行它,但同样的事情发生了。我还包含了应包含在 list 中的必要代码。
这是我的代码(Open GL ES 代码位于虚线之间):
public class MainActivity extends ActionBarActivity {
private GLSurfaceView mGLView;
private GLSurfaceView.Renderer MyRenderer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView=new MyGLSurfaceView(this);
setContentView(mGLView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
//....................................................................................................
class MyGLSurfaceView extends GLSurfaceView{
public MyGLSurfaceView(Context context){
super(context);
MyRenderer=new MyGlRenderer();
setRenderer(MyRenderer);
setEGLContextClientVersion(2);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
}
//Triangle mTriangle;
public class MyGlRenderer implements GLSurfaceView.Renderer{
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config){
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
//mTriangle= new Triangle();
}
@Override
public void onDrawFrame(GL10 unused){
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
//mTriangle.draw();
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height){
GLES20.glViewport(0,0,width,height);
}
}
public class Triangle{
private FloatBuffer vertexBuffer;
static final int COORDS_PER_VERTEX=3;
float triangleCoords[]={
0.0f, 0.622008459f, 0.0f,//top
-0.5f, -0.311004243f, 0.0f, //bottom left
0.5f, -0.311004242f,0.0f//bottom right
};
int mProgram;
float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
public Triangle(){
ByteBuffer bb=ByteBuffer.allocateDirect(
triangleCoords.length*4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer=bb.asFloatBuffer();
vertexBuffer.put(triangleCoords);
vertexBuffer.position(0);
int vertexShader=loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader=loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram=GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, fragmentShader);
GLES20.glLinkProgram(mProgram);
}
public int loadShader(int type, String shaderCode){
int shader=GLES20.glCreateShader(type);
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
static final int vertexStride = COORDS_PER_VERTEX * 3;
static final int vertexCount = 3;
public void draw(){
GLES20.glUseProgram(mProgram);
int mPositionHandle= GLES20.glGetAttribLocation(mProgram, "vPosition");
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
int mColorHandle=GLES20.glGetUniformLocation(mProgram,"vColor");
GLES20.glUniform4fv(mColorHandle, 1, color,0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
}
//....................................................................................................
}
这是日志行为,供任何需要它的人使用:
06-23 11:44:30.385: D/ActivityThread(27794): setTargetHeapUtilization:0.25 06-23 11:44:30.385: D/ActivityThread(27794): setTargetHeapIdealFree:8388608 06-23 11:44:30.385: D/ActivityThread(27794): setTargetHeapConcurrentStart:2097152 06-23 11:44:30.535: W/dalvikvm(27794): threadid=1: thread exiting with uncaught exception (group=0x40ee7438) 06-23 11:44:30.535: E/AndroidRuntime(27794): FATAL EXCEPTION: main 06-23 11:44:30.535: E/AndroidRuntime(27794): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp5/com.example.myapp5.MainActivity}: java.lang.IllegalStateException: setRenderer has already been called for this instance. 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread.access$700(ActivityThread.java:143) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.os.Handler.dispatchMessage(Handler.java:99) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.os.Looper.loop(Looper.java:137) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread.main(ActivityThread.java:4953) 06-23 11:44:30.535: E/AndroidRuntime(27794): at java.lang.reflect.Method.invokeNative(Native Method) 06-23 11:44:30.535: E/AndroidRuntime(27794): at java.lang.reflect.Method.invoke(Method.java:511) 06-23 11:44:30.535: E/AndroidRuntime(27794): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 06-23 11:44:30.535: E/AndroidRuntime(27794): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 06-23 11:44:30.535: E/AndroidRuntime(27794): at dalvik.system.NativeStart.main(Native Method) 06-23 11:44:30.535: E/AndroidRuntime(27794): Caused by: java.lang.IllegalStateException: setRenderer has already been called for this instance. 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.opengl.GLSurfaceView.checkRenderThreadState(GLSurfaceView.java:1810) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.opengl.GLSurfaceView.setEGLContextClientVersion(GLSurfaceView.java:472) 06-23 11:44:30.535: E/AndroidRuntime(27794): at com.example.myapp5.MainActivity$MyGLSurfaceView.(MainActivity.java:80) 06-23 11:44:30.535: E/AndroidRuntime(27794): at com.example.myapp5.MainActivity.onCreate(MainActivity.java:31) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.Activity.performCreate(Activity.java:5160) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 06-23 11:44:30.535: E/AndroidRuntime(27794): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 06-23 11:44:30.535: E/AndroidRuntime(27794): ... 11 more
最佳答案
setEGLContextClientVersion()
需要在 setRenderer()
之前调用,如文档中所述:http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setEGLContextClientVersion(int) .
在您复制的堆栈跟踪中还有一个提示,表明这是您的问题:
java.lang.IllegalStateException: setRenderer has already been called for this instance.
关于java - 当我尝试创建 Opengl ES 环境时,我的应用程序不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370226/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!