所以我在OpenGL ES中生成了一个球体(特别是OpenGL ES 2.0,在Java中,用于Android).当这个球体放置在与用于我的视图矩阵的中心相同的位置时,它很好,但是当偏离中心时,球体会非常扭曲(见下文).
为什么会发生这种情况,我该如何制止呢?

这是同一个领域.右上角的那个只是在x和y(不是z)中翻译.
我的GLSurfaceView.renderer实现代码的一些片段,
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
// Both centred on (0,0,0), of radius 1.0.
outerSphere = new Sphere();
centreSphere = new Sphere();
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = …Run Code Online (Sandbox Code Playgroud) 我有个CUDA模板库,其中一个功能实际上是不是一个模板,但被一中定义的.cuh头.(vector_add_kernel在kernel.cuh下面.)
如果多个.cu文件包含kernel.cuh并调用vector_add[_kernel],则会在链接时导致多个定义错误.在C++中,可以使用inline限定符来避免此类错误.
但是,inline __global__ ...- 在防止系统出现多重定义错误的同时- 会导致警告inline已忽略限定符.
问:有没有更好的方法来避免多重定义错误,或者只为此功能抑制此警告的方法?而且是inline __global__连安全,或者可能其他主机编译器真正忽略它?
我可以简单地移动vector_add_kernel到一个单独的.cu文件,但它将是唯一的非头文件.我也可以模板vector_add_kernel,但在我的库中没什么意义.
一个(不那么小,对不起)工作示例(使用CUDA 7.0测试,Debian上的gcc 4.7.2)如下所示.
澄清main.cu一下,是一些用户的代码; lib.cu是一些不属于我的外部图书馆; 并且kernel.cuh是我的模板库的一部分.因此,外部lib和用户main都使用我的模板库,kernel.cuh但是分开.
main.cu:
#include "lib.hpp"
#include "kernel.cuh"
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <cstddef> …Run Code Online (Sandbox Code Playgroud)