场景
我正在创建一个帧缓冲区对象并将纹理绑定到颜色附件0.我没有使用深度缓冲区.创建它之后,我解开它.
在某个时间点之后,帧缓冲区被绑定,向其呈现三角形条带(某些部分部分透明),然后再次解除绑定.使用不同的三角形条重复多次.
最终,绘制到主帧缓冲区的是纹理四边形,其纹理附加到我创建的帧缓冲区对象上.
问题
我发现绘制到纹理中的三角形条带的部分透明部分与其他三角形条带重叠没有正确混合.它们似乎与白色混合,而不是纹理中已经存在的颜色.即使我用纯绿色填充纹理(例如),在混合时拾取的颜色仍然是白色.
这里是我用来完成所有这些的代码的几个片段:
初始化
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &framebuffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
渲染到纹理(迭代)
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// On the first render iteration, do_clear is true
if (do_clear)
{
glClearColor(r, g, b, a);
glClear(GL_COLOR_BUFFER_BIT);
}
// ... render the current triangle strip ...
glBindFramebuffer(GL_FRAMEBUFFER, …Run Code Online (Sandbox Code Playgroud) 有没有办法以编程方式确定build.gradle文件中当前版本的ABI(arm64-v8a,armeabi-v7a,x86等)?
我试过创建一个这样的函数:
def getABIFromCurrentBuild() {
return android.os.Build.CPU_ABI;
}
Run Code Online (Sandbox Code Playgroud)
但是Gradle插件无法使用android.os包.
背景:
我在Android Studio中有一个使用JNI库的应用程序项目.反过来,JNI库链接到使用Makefiles在Android Studio外部构建的静态C++库.但是,静态库被拆分为不同的版本(每个ABI一个版本).
我想避免为JNI库创建Makefile,只需在我的应用程序的Android Studio中的build.gradle文件中使用ndk块.这是我的ndk块的样子:
ndk {
moduleName "myJNILib"
cFlags "-std=c++11"
ldLibs "GLESv3 ${project.projectDir}/../../build/local/${getABIFromCurrentBuild()}/myStaticLib.a"
stl "gnustl_shared"
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在构建JNI库时已将我的静态库入侵到链接器命令行,但我仍然试图弄清楚如何链接其中的正确版本.
我也尝试将所有ABI类型分离到productFlavors块中,如下所示:
productFlavors {
x86 {
ndk {
abiFilter "x86"
moduleName "myJNILib"
cFlags "-std=c++11"
ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86/myStaticLib.a"
stl "gnustl_shared"
}
}
x86_64 {
ndk {
abiFilter "x86_64"
moduleName "myJNILib"
cFlags "-std=c++11"
ldLibs "GLESv3 ${project.projectDir}/../../build/local/x86_64/myStaticLib.a"
stl "gnustl_shared"
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
这使得所有内容都正确链接,但是由于Gradle插件使用的apk命名方案比我在productFlavors中捕获的更复杂,因此JNI共享库只被复制到某些apks中.
例如,其中一个apks名为"app-arm64-x86_64-debug".在这种情况下,没有匹配的ABI过滤器.
更新
现在,我只需在我的静态库代码中添加一个符号链接就可以避免使用单独的静态库<project>/app/src/main/jni/.这使它直接编译到JNI库中,这与链接到静态库的效果基本相同.此外,它还具有图书馆源代码在Android Studio中显示的优势,使其更易于访问.