小编dat*_*olf的帖子

3D投影问题:Z值在透视分割后不在[1,-1]中

我正在尝试在光栅化3D点的过程中进行简单的透视投影.这是所有的矩阵和其他信息.所有矩阵都是行专业.坐标系是Right Handed.

相机位于[0,0,-1],点位于[0,0,0](矩阵运算时w = 1)

模型视图矩阵(凸轮矩阵的逆,即tx = 0; ty = 0; tz = 1):

[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1 ]
Run Code Online (Sandbox Code Playgroud)

透视矩阵:

[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]
Run Code Online (Sandbox Code Playgroud)

aspect等于1,因为视口是方形的.远= 100且近= 0.1 f = 1/tan(fovDegress*M_PI/360);

结果矩阵是:

1.94445, 0,        0,        0
0,       1.944445, 0,        0
0,       0,        1.020202, -2.020202
0,       0,        1,        0
Run Code Online (Sandbox Code Playgroud)

现在我将模型视图矩阵然后投影矩阵应用于点向量,然后我得到一个新点Pv = {x,y,z,w}然后我得到归一化的坐标x'= x/w; y'= y/w; 和z'= z/w; 只要该点在平截头体中,x'和y'总是位于[-1,1]之间.但z'的情况并非如此.随着接近相机的点,z'值呈指数增长.当点位于[0,0,0]时,z'的值等于-1.

现在,我需要剪切一些行,所以我需要z'值介于[1,-1]之间.我想知道我的手术有什么问题.谢谢.

opengl directx 3d projection perspective

5
推荐指数
1
解决办法
2575
查看次数

CUDA同步内核

嗨我对CUDA中的编程有疑问.我有以下代码:

int main () {

    for (;;) {
        kernel_1 (x1, x2, ....);
        kernel_2 (x1, x2 ...);
        kernel_3_Reduction (x1);

    // code manipulation host_x1
    // Copy the pointer device to host
        cpy (host_x1, x1, DeviceToHost)
        cpu_code_x1_manipulation;
        kernel_ (x1, x2, ....);
    }

}
Run Code Online (Sandbox Code Playgroud)

所以当副本发出时,我如何确保kernel_1,kernel_2 kernel_3并完成了他们的任务?

cuda

5
推荐指数
2
解决办法
6342
查看次数

为gradle生成的AndroidManifest指定额外的XML

是否可以为gradle生成的AndroidManifest指定额外的XML字段.具体来说,用例是我有一个使用谷歌地图的应用程序,根据他们的文档,应用程序必须指定:

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>
Run Code Online (Sandbox Code Playgroud)

在AndroidManifest中.如果您尝试使用gradle测试此应用程序,您将获得:

$ ./gradlew connectedCheck
<snip>
:myapp:processTestTestManifest
[manifestMerge1694110764542760523.xml:1, manifestMerge678902239503841223.xml:15] Main manifest has <uses-feature android:glEsVersion='0x00010000'> but library uses glEsVersion='0x00020000'
Note: main manifest lacks a <uses-feature android:glEsVersion> declaration, and thus defaults to glEsVersion=0x00010000.
Run Code Online (Sandbox Code Playgroud)

我目前的(相关)项目结构是:

myapp/AndroidManifest.xml
myapp/project.properties
myapp/res/
myapp/src/com/magic/package/Foo.java
myapp/tests/java/com/magic/package/test/FooTest.java
Run Code Online (Sandbox Code Playgroud)

换句话说,遗留项目结构除外tests/.我也试过添加一个任意的AndroidManifest.xml myapp/tests/,尽管文档说不是,只是作为一个测试.但是,我没有运气.

buid.gradle看起来像:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    compile project('stuff')
}

android {
    compileSdkVersion 17 …
Run Code Online (Sandbox Code Playgroud)

testing android google-maps gradle

5
推荐指数
1
解决办法
876
查看次数

如何使CMake在单个构建中定位多个平台

我想以某种方式配置我的CMake项目,以便单个构建执行针对多个平台(在我的情况下,我想为Linux和Windows构建,每个x86_32和x86_64目标).我已经安装并运行了交叉编译工具链,并为每个单独的目标工作.

因此,挑战在于以某种方式设置CMake,即为CMAKE_SYSTEM_…每个子构建适当地设置工具链和变量.我怎样才能做到这一点?

cross-platform cmake

5
推荐指数
1
解决办法
3022
查看次数

修复了 QGraphicsView 中的变换叠加

在我正在开发的基于 Qt 的应用程序中,我使用 QGraphicsView 在 2D 网格中显示传感器数据。在侧面,我想显示一个图例/调色板,将网格中的颜色与值相关联。

用户可以缩放和平移传感器数据视图,但可以理解的是,调色板应该在视图中固定。因此,将调色板/图例放置在传感器视图场景中需要一些额外的注意:应用逆用户变换。

不过,我宁愿将调色板/图例实现为一种(非交互式)覆盖层,并具有自己的转换。这有可能吗?

overlay transform qt4 qgraphicsview qgraphicsscene

4
推荐指数
1
解决办法
3240
查看次数

CUDA流,纹理绑定和异步memcpy

在CUDA中编写一些信号处理我最近在优化它方面取得了巨大进步.通过使用1D纹理并调整我的访问模式,我设法获得了10倍的性能提升.(我之前尝试过将事务对齐从全局到共享内存的预取,但后来发生的非均匀访问模式搞砸了warp→共享缓存库关联(我认为)).

所以现在我正面临着这个问题,CUDA纹理和绑定如何与异步memcpy交互.

考虑以下内核

texture<...> mytexture;

__global__ void mykernel(float *pOut)
{
    pOut[threadIdx.x] = tex1Dfetch(texture, threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)

内核以多个流启动

extern void *sourcedata;

#define N_CUDA_STREAMS ...

cudaStream stream[N_CUDA_STREAMS];
void *d_pOut[N_CUDA_STREAMS];
void *d_texData[N_CUDA_STREAMS];

for(int k_stream = 0; k_stream < N_CUDA_STREAMS; k_stream++) {
    cudaStreamCreate(stream[k_stream]);

    cudaMalloc(&d_pOut[k_stream], ...);
    cudaMalloc(&d_texData[k_stream], ...);
}

/* ... */

for(int i_datablock; i_datablock < n_datablocks; i_datablock++) {
    int const k_stream = i_datablock % N_CUDA_STREAMS;
    cudaMemcpyAsync(d_texData[k_stream], (char*)sourcedata + i_datablock * blocksize, ..., stream[k_stream]);

    cudaBindTexture(0, &mytexture, d_texData[k_stream], ...);

    mykernel<<<..., stream[k_stream]>>>(d_pOut);
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道的是,因为只有一个纹理引用,当我将缓冲区绑定到纹理而其他流的内核访问该纹理时会发生什么?cudaBindStream不采用流参数,所以我担心通过将纹理绑定到另一个设备指针,而运行内核异步访问所述纹理我会转移他们对其他数据的访问.

CUDA文档没有说明这一点.如果必须解开这个允许并发访问,似乎我必须创建一些纹理引用并使用switch语句在它们之间进行选择,基于作为内核启动参数传递的流号.

不幸的是,CUDA不允许在设备端放置纹理数组,即以下方法不起作用: …

concurrency textures asynchronous cuda

3
推荐指数
1
解决办法
2169
查看次数

导入/加载要在缓冲区中突出显示的编译器警告/错误列表?

在 vim 中,您可以使用该:make命令启动构建过程。现在我想从 Vim 外部开始构建过程(例如每晚构建)并加载编译器错误/警告日志,突出显示打开的缓冲区中的所有错误和警告。

Vim 是否可以使用内置功能来做到这一点,或者我需要一个 vimscript 吗?如果有,是哪一个?

vim

3
推荐指数
1
解决办法
373
查看次数

在 C/C++ 中,在不使用计算的布尔值的情况下使用布尔运算符短路进行控制流是否安全?

一段继承代码中的重复模式是,只要其中一个函数返回某个值,就会调用函数链并中止该链。该值随后将用于后续计算。为了演示起见,破坏值为0。考虑以下程序:

#include <stdio.h>

static int n;

static int foo(int x)
{
    fprintf(stderr, "%d(%d) ", x, n++);
    return x ? 0 : n;
}

static void with_if(void)
{
    int rc;
    n = 0;

    do {
        if( (rc = foo(1)) ) break;
        if( (rc = foo(2)) ) break;
        if( (rc = foo(3)) ) break;
        if( (rc = foo(4)) ) break;
        if( (rc = foo(0)) ) break;
        if( (rc = foo(5)) ) break;
    } while(0);

    fprintf(stderr, ">>%d<<\n", rc);
}

void with_short_circuit(void) …
Run Code Online (Sandbox Code Playgroud)

c c++ language-lawyer

3
推荐指数
1
解决办法
656
查看次数

在 Metal 中,将顶点和片段缓冲区设置为相同的 MTLBuffer 是否仅将其复制到 GPU 一次?

我将统一缓冲区传递给顶点和片段着色器。

let uniformBuffer = device.makeBuffer(length: 4096, options: [])
renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1)
renderEncoder.setFragmentBuffer(uniformBuffer,offset:0, at: 1)
Run Code Online (Sandbox Code Playgroud)

这是否将uniformBuffer从CPU复制到GPU两次?然后我将把缓冲区从顶点着色器传递给发生在 GPU 内部的片段着色器。

swift metal

3
推荐指数
1
解决办法
805
查看次数

在旋转时获取顶点的当前顶点位置

我有一个非常简单的程序与我的介绍OpenGL的东西.我在屏幕上有3d顶点,整个系统沿y轴旋转.

float rotation =0;
//update function
rotation = rotation +1;
Run Code Online (Sandbox Code Playgroud)

draw函数看起来像这样:

glPushMatrix();
        glTranslatef(500,390,0);
        glRotatef(rotation,0.0,1.0,0.0);
        glVertex3d(365,50,0);
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

当glVertex旋转时,它在屏幕上的位置明显变化.但点的坐标本身并非如此.我如何得到current已通过旋转屏幕上的点的坐标glRotatef,当他们的"实际"的坐标是固定的?

c++ opengl 3d transformation vertex

1
推荐指数
1
解决办法
1356
查看次数