我调整了 native Activity NDK 示例以合并 hello-gl2 示例中的 OpenGL 代码。我处理 APP_CMD_INIT_WINDOW 消息,然后尝试创建着色器。着色器创建失败,我尝试通过 getShaderInfoiv 获取信息,但同样失败。
所以我的问题是 - 如何在纯原生 Android 应用程序中创建 OpenGL ES 2.0 着色器?
附言我知道如果您使用 Java GLSurfaceView 并且没有在正确的线程中创建它们,着色器创建可能会失败,但是查看 native Activity 示例,它似乎只有一个线程!
最佳答案
当然可以在原生 Android 应用程序中创建 OpenGL ES 2.0 着色器。关键是使用正确的 OpenGL ES 2.0 上下文。我在我的应用程序中做了类似的事情,即在 native 部分初始化 EGL 上下文,然后仅在 native 代码中创建(和使用)着色器。根据我设法做到的,我认为您想要做的也是完全可能的。
由于我在 Java 代码中有一个入口点(没有使用 NativeAcvity 机制),我还必须将 native 窗口句柄 (EGLNativeWindowType) 从 java 传递到 C++,以便在 native 代码中创建 EGL 表面.但是,由于您想简单地修改 NativeActivity 示例,因此您可以使用 engine->app->window 创建 EGL 表面,如 NativeActivity main.c 示例中所示。
好的,如何在 native 代码中创建适当的 OpenGL ES 2.0 上下文?我刚刚对 NativeActivity 示例中的 main.c 文件进行了两项更改并检查了它是否有效。
首先,使用了下面的EGL属性
const EGLint attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //important
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
在 eglChooseConfig(display, attribs, &config, 1, &numConfigs); 中。
其次,稍后在创建上下文中使用
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
在 context = eglCreateContext(display, config, NULL, attrib_list);
我保留了其余代码不变。我打印了一些信息以确保正在使用 OpenGL ES 2.0:
I/native-activity( 955): Details: [Version: OpenGL ES 2.0 1403843], [Vendor: Qualcomm], [Renderer: Adreno 205], [Extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture ... ]
希望对您有所帮助!
关于android - 在 NativeActivity 中创建 OpenGL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764454/
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我正在尝试找到解决此问题的好方法。假设我有一个包含帖子、标题和不同状态ID的表格。在我的Controller索引中,我有:@posts=Post.all然后在我的模型中我有:defcheck_status(posts)posts.eachdo|post|#logichereendend所以在我的Controller中我有:@posts.check_status(@posts)但我在加载索引时遇到以下错误:undefinedmethodcheck_statusfor有什么想法吗? 最佳答案 它应该是一个类方法,以self.为前缀:de
为什么我不能这样做:classCreateModels是否有其他方法可以使数组(“apples”)成为Fruit类实例的属性? 最佳答案 在Rails4中并使用PostgreSQL,您实际上可以在数据库中使用数组类型:迁移:classCreateSomething 关于ruby-on-rails-为什么我不能在Rails的表格中创建一个数组作为列?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/qu
我尝试创建新模型,该模型在数据库中没有表的情况下具有自动类型转换。我试图从ActiveRecord::Base继承它抛出异常ActiveRecord::StatementInvalid:PG::UndefinedTable:ERROR:relation"people"doesnotexist类实现:classPerson堆栈跟踪:ActiveRecord::StatementInvalid:PG::UndefinedTable:ERROR:relation"people"doesnotexistLINE8:WHEREa.attrelid='"people"'::regclass^:SE
我正在构建一个连接到服务器并等待数据的客户端Ruby库,但也允许用户通过调用方法发送数据。我使用的机制是有一个初始化套接字对的类,如下所示:definitialize@pipe_r,@pipe_w=Socket.pair(:UNIX,:STREAM,0)end我允许开发人员调用以将数据发送到服务器的方法如下所示:defsend(data)@pipe_w.write(data)@pipe_w.flushend然后我在一个单独的线程中有一个循环,我从连接到服务器的socket和@pipe_r中选择:defsocket_loopThread.newdosocket=TCPSocket.new