- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我将 ATI 驱动程序(我使用的是 HD7970)更新为最新版本,但我的一些 OpenGL 项目的对象停止工作。更重要的是他们在 nVidia 最新的驱动程序上工作(在 960m 上测试)。我应该知道 ATI 和 nVidia 渲染管道之间有什么区别吗?
附加信息:
当我尝试用三角形绘制时,我什么也看不到,但是当我切换到 GL_POINTS 时,我看到绿点(片段着色器的输出是纯绿色 channel ),它们正在按预期移动。这可能表明顶点着色器正在启动,因为正在发生 MVP 乘法。这些是带有一个大 VBO 的行星 LOD 对象,所以我使用一个函数来绑定(bind)所有缓冲区,并使用另一个函数来绘制必要的高度图。 VBO大小为128MB
初始化:
glGenBuffers(1, &VBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, VBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, size * sizeof(vec4), NULL, GL_DYNAMIC_COPY);
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(unsigned int), NULL, GL_DYNAMIC_DRAW);
glGenBuffers(1, &Normals);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, Normals);
glBufferData(GL_SHADER_STORAGE_BUFFER, size * sizeof(vec4), NULL, GL_DYNAMIC_COPY);
通过多边形化器(计算着色器)填充 VBO:
#version 430 core
layout( std430, binding=1 ) buffer ParamsBuffer
{
float size;
uint index;
int parentIndex;
uint textureSize;
vec4 upVector;
vec4 Position;
vec4 quadrant;
};
layout( std430, binding=2 ) buffer VertBuffer
{
vec4 VBO[ ];
};
layout( std430, binding=3 ) buffer NormalsBuffer
{
vec4 Normals[ ];
};
layout(std430, binding = 4) buffer IndexBuffer
{
uint Index[];
};
layout( std430, binding=10 ) buffer DebugBuffer
{
vec4 debug;
};
layout (rgba32f) uniform image2D HeightMap;
layout (rgba32f) uniform image2D NormalMap;
layout( local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main(void)
{
uint WGidY=(gl_WorkGroupID.y);
uint WGidX=(gl_WorkGroupID.x);
uint mapVBOOffset=index*textureSize*textureSize;
uint indexOffset=6*index*textureSize*textureSize;
VBO[WGidY*textureSize+WGidX+mapVBOOffset]=imageLoad(HeightMap, ivec2(WGidX, WGidY));
Normals[WGidY*textureSize+WGidX+mapVBOOffset]=imageLoad(NormalMap, ivec2(WGidX, WGidY));
// debug=VBO[0];
if(WGidX==textureSize-1 || WGidY==textureSize-1)
return;
uint localIndex = 6*(WGidY*textureSize+WGidX)+indexOffset;
Index[localIndex+0]=(WGidY+1)*textureSize+WGidX +mapVBOOffset;
Index[localIndex+1]=WGidY*textureSize +WGidX+1+mapVBOOffset;
Index[localIndex+2]=WGidY*textureSize +WGidX +mapVBOOffset;
Index[localIndex+3]=WGidY*textureSize +WGidX+1+mapVBOOffset;
Index[localIndex+4]=(WGidY+1)*textureSize+WGidX +mapVBOOffset;
Index[localIndex+5]=(WGidY+1)*textureSize+WGidX+1+mapVBOOffset;
}
绑定(bind):
glUseProgram(RenderProgram);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, PerFrameBuffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, ConstantBuffer);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, Normals);
glVertexAttribPointer(
2,
4,
GL_FLOAT,
GL_FALSE,
0,
(void*)0
);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(
0,
4,
GL_FLOAT,
GL_FALSE,
0,
(void*)0
);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
绘图:
float discardFactor = 0;
GLint drawMode;
if(renderMode==0)
drawMode = GL_TRIANGLES;
if (renderMode == 1)
{
drawMode = GL_PATCHES;
GLint vert= 3;
glPatchParameteri(GL_PATCH_VERTICES, 3);
}
if (tile->quadrant_x == nullptr)
{
HeightMap hp = tile->quadrantX;
if (CornersInFrustum(hp.Corners))
{
int mapOffset = tile->quadrantX.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int);
glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset);
}
}
if (tile->quadrant_y == nullptr)
{
HeightMap hp = tile->quadrantY;
if ( CornersInFrustum(hp.Corners))
{
int mapOffset = tile->quadrantY.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int);
glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset);
}
}
if (tile->quadrant_z == nullptr)
{
HeightMap hp = tile->quadrantZ;
if (CornersInFrustum(hp.Corners))
{
int mapOffset = tile->quadrantZ.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int);
glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset);
}
}
if (tile->quadrant_w == nullptr)
{
HeightMap hp = tile->quadrantW;
if (CornersInFrustum(hp.Corners))
{
int mapOffset = tile->quadrantW.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int);
glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset);
}
}
顶点着色器:
#version 430 //core
layout(location = 0) in vec4 vertexPosition_modelspace;
layout(location = 2) in vec4 vertexNormal_modelspace;
layout(std430, binding = 4) buffer PerFrame
{
mat4 ViewMatrix;
vec4 CameraPosition;
vec4 CameraForward;
mat4 ModelMatrix;
float time;
float perFrametab[3];
};
layout(std430, binding = 5) buffer Constant
{
mat4 ProjectionMatrix;
vec4 SeedBuffer;
vec2 screenSize;
};
layout( std430, binding=10 ) buffer DebugBuffer
{
vec4 debug;
};
out vec3 Position_worldspace;
out vec3 Normal_cameraspace;
out vec3 EyeDirection_cameraspace;
out vec3 LightDirection_cameraspace;
out vec3 LightPosition_worldspace;
out vec3 NormalWorldSpace;
void main()
{
gl_Position =ProjectionMatrix*
ViewMatrix*ModelMatrix*
vec4(vertexPosition_modelspace.xyz,1);
float C = 1,
near = 0.1,
far = 10000000.0f;
gl_Position.z = (2*log2(C*gl_Position.w + 1) / log2(C*far + 1) - 1) * gl_Position.w;
Position_worldspace = (ModelMatrix*vec4(vertexPosition_modelspace.xyz,1)).xyz;
Normal_cameraspace = ( ViewMatrix *(vec4(vertexNormal_modelspace.xyz,0))).xyz;
vec4 normalTemp=ModelMatrix*vertexNormal_modelspace;
NormalWorldSpace=normalize(normalTemp.xyz);
}
最佳答案
好的,我找到了解决方案。问题出在计算着色器的 imageStore() 和 imageLoad() 中。即使我将 image2D 用于存储目的,我也需要添加
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
生成纹理后。这就是 ATI 和 nVidia 之间的区别。
关于c++ - nVidia 和 ATI 之间的 OpenGL 渲染差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160723/
我正在尝试在 Google Colab 上运行 stylegan2,但在我的 Drive 上运行所有文件,并避免使用 !git clone 从 github of stylegan2 。 这是我在特定
我需要升级我的 nvidia 驱动程序,以便尝试运行 NVIDIA-LInux-x86_64.run文件 但是,我看到以下消息 ERROR: An NVIDIA kernel module 'nvid
我经历过Cuda programming guide但仍然不清楚 cuda 内核在 GPU 上的什么位置?换句话说,它驻留在哪个内存段? 另外,我怎么知道我的设备支持的最大内核大小是多少?最大内核大小
我想在基于官方nvidia/cuda的容器中运行带有cuvid硬件加速解码的ffmpeg图片。 Ffmpeg 无法找到 libnvcuvid.so,尽管有所有必需的 cuda 库。ldconfig -
当我运行命令 nvidia-smi ,我得到以下两个按总线 ID 排序的 GPU: For GPU 0, 00000000:0A:00.0 For GPU 1, 00000000:41:00.0 但是
我正在使用 Ubuntu 14.04 LTS 运行 AWS EC2 g2.2xlarge 实例。我想在训练 TensorFlow 模型时观察 GPU 利用率。我在尝试运行“nvidia-smi”时遇到
我尝试在安装 docker-ce 后安装 nvidia-docker。我关注的是:https://github.com/NVIDIA/nvidia-docker安装 nvidia-docker。看来已
我一直认为 Hyper-Q 技术不过是 GPU 中的流。后来我发现我错了(是吗?)。所以我读了一些关于 Hyper-Q 的书,却更加困惑了。 我正在浏览一篇文章,它有以下两个陈述: A. Hyper-
我刚刚在安装了两个 K20m GPU 的服务器中运行了 simpleMultiGPU。然后运行 nvidia-smi 命令来显示 GPU 的状态。结果如下: 问题如下: GPU 内存使用情况似乎不
NVIDIA-SMI 抛出此错误: NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make
如何使用 Vulkan 来利用 Nvidia 的张量核心(在计算着色器中?!)? Nvidia 有这篇文章 Programming Tensor Cores in CUDA 9 ,但这显然是针对 CU
我在类的一个项目中使用 Chapel,我正在尝试使用我的两个 Nvidia Jetson nano 板进行多语言环境执行。按照本教程 https://chapel-lang.org/docs/usin
我得到nvidia-smi得到Memory-Usage是这样的 $nvidia-smi -i 0,1 Wed Mar 4 16:20:07 2020 +-----------------
我得到nvidia-smi得到Memory-Usage是这样的 $nvidia-smi -i 0,1 Wed Mar 4 16:20:07 2020 +-----------------
有没有区别: nvidia-docker 运行 和 docker run --runtime=nvidia ? 在 official docs他们使用后者,但我在其他在线教程中看到过前者。 最佳答案
我有一个用 C 编写的代码(使用 opencl 规范)来列出所有可用的设备。我的 PC 安装了 AMD FirePro 和 Nvidia 的 Tesla 显卡。我先安装了AMD-APP-SDK-v3.
我读到可以使用内核启动来同步不同的 block ,即,如果我希望所有 block 在进行操作 2 之前完成操作 1,我应该将操作 1 放在一个内核中,将操作 2 放在另一个内核中。这样,我可以实现 b
我目前正在尝试使用函数 NvAPI_Stereo_SetDriverMode 将 nvapi 设置为在直接模式下工作。 根据 Nvidia nvapi site (在手册中),如果你想做一个 dire
我对nvidia GPU的任务调度有些疑惑。 (1)如果一个 block (CTA)中的线程束已经完成,但仍有其他线程在运行,这个线程会等待其他线程完成吗?换句话说,当所有线程都完成时, block
有人在Nvidia Tegra X1上使用了tensorflow吗? 我发现一些资料表明TK1上可能存在这种情况,或者TX1上存在严重的黑客入侵/错误,但尚无确定的配方。 http://cudamus
我是一名优秀的程序员,十分优秀!