我想听听有两种编码经验的人的意见.我自己,我只有NVIDIA的经验.
NVIDIA CUDA似乎比竞争对手更受欢迎.(只计算这个论坛上的问题标签,'cuda'优于'opencl'3:1,'nvidia'优于'ati '15:1,并且根本没有'ati-stream'标签.
另一方面,根据维基百科,ATI/AMD显卡应该具有更大的潜力,特别是每美元.目前市场上最快的NVIDIA显卡,GeForce 580(500美元),评级为1.6单精度TFlops.AMD Radeon 6970的售价为370美元,售价为2.7 TFlops.580具有512个执行单元,772 MHz.6970具有1536个执行单元,频率为880 MHz.
AMD相对于NVIDIA的纸张优势有多现实,是否可能在大多数GPGPU任务中实现?整数任务会发生什么?
我正在使用AMD显示库,它基本上允许我们控制GPU的某些参数(时钟速度/风扇控制).
SDK附带一个Sample-Managed
代码,我能够从ADL_Overdrive6_StateInfo_Get
方法中获得所需的结果(核心和内存时钟速度).
使用该ADL_Overdrive6_State_Set
方法(具有相同的参数)将返回错误代码:
int od_result = ADL.ADL_Overdrive6_State_Set(OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex, ADL.ADL_OD6_SETSTATE_PERFORMANCE, stateInfoBuffer);
-8 ADL_ERR_NOT_SUPPORTED
(驱动程序不支持的功能.)
我在AMD Radeon R9 280x/AMD Radeon HD 7970和配备AMD Radeon 8670M的笔记本电脑的系统上进行了测试.
我是否需要在驱动程序设置中更改某些内容并且是否存在兼容性问题?
我正在为带有AMD Radeon HD 6970M 2048 MB显卡的iMac编写GLSL顶点着色器:
GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20
Run Code Online (Sandbox Code Playgroud)
在我的着色器中,我想要一大堆均匀的mat4s:
uniform mat4 T[65]
Run Code Online (Sandbox Code Playgroud)
但如果我尝试将65个这样的着色器(秘密地)切换到Apple Software Renderer模式.如果我改为使用64:
uniform mat4 T[64]
Run Code Online (Sandbox Code Playgroud)
一切都好.
似乎是超过最大制服数量的问题.但正如我上面写的那样,GL_MAX_VERTEX_UNIFORM_COMPONENTS为4096 /(4*4)= 256而不是64 ...
ATI/AMD注意:ATI最大组件值是错误的.它们是实际的组件数除以4.
但是读到这个我会认为如果我查询GL_MAX_VERTEX_UNIFORM_COMPONENTS并得到4096,那我实际上有16,384.似乎是这样的情况是GL_MAX_VERTEX_UNIFORM_COMPONENTS返回实际的组件数乘以 4.这将得到1024 /(4*4)= 64.
谁能证实这一点?
编辑: 我的着色器很简单:
#version 120
// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];
void main()
{
gl_Position = T[int(indices[0])]*gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud) 各位,我试图在我的OpenGL实例绘图中使用glVertexAttribDivisor.
它适用于NV卡,但在ATI卡中不起作用.什么都没画.
从GlExtensionViewer,它显示这两个卡都支持glVertexAttribDivisor/InstancedStream.跑步时没有错误.
我不知道这是否是由于我的错误用法造成的.
我将实例数据放在一个单独的顶点数组缓冲区中,然后将其映射到gl_MultiTexCoord0~3.实例数据是世界矩阵.
代码就在这里.
for( int i=0;i<3;i++)
{
glClientActiveTexture(kGL_TEXTURE0 + i);
glTexCoordPointer(size, type, stride, i*4*sizeof(float));
int instanceVertexAttribIndex = i + 8;
glVertexAttribDivisorARB(instanceVertexAttribIndex, 1);
}
Run Code Online (Sandbox Code Playgroud)
关键问题是如果我尝试将实例数据放在gl_MultiTexCoord0上,我应该给glVertexAttribDivisorARB正确的"索引"?
valgrind --leak-check=full ./CH02_HelloTriangle
==11404== Memcheck, a memory error detector
==11404== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==11404== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==11404== Command: ./CH02_HelloTriangle
==11404==
==11404== Jump to the invalid address stated on the next line
==11404== at 0x0: ???
==11404== by 0x6F9271A: ??? (in /usr/lib/fglrx/dri/fglrx_dri.so)
==11404== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==11404==
==11404==
==11404== Process terminating with default action of signal 11 (SIGSEGV)
==11404== …
Run Code Online (Sandbox Code Playgroud) 我的编程经验大约是高中1年的C/C++经验,但几个月前我做了我的研究并用OpenCL编写了一个简单的程序.我能够使用g ++和--framework选项在Apple计算机上相对容易地编译和运行它.现在我在我的Ubuntu机器上,我不知道如何编译它.已经下载了正确的驱动程序以及ATI的Stream SDK(我有一台ATI Radeon HD5870).任何帮助,将不胜感激!
我需要知道用户是否正在使用Chrome浏览带有webgl黑名单上的显卡的网站:
http://support.google.com/chrome/bin/answer.py?hl=en-GB&answer=1220892
具体来说,我需要知道他们是否使用ATI卡.我在THREE.js上做的项目在ATI卡上的Chrome浏览器中产生了一个非常难看的渲染(线条没有消除锯齿),我想提供一个替代方案.
我知道有一个后期效果模糊了线条,但艺术方向的结果更糟糕.
我要送顶点使用glVertexAttribPointer属性来着色期待他们作为内置(gl_Vertex
,gl_Color
,等).
该glVertexAttribPointer
函数需要指定每个内置属性的索引(或位置).我可以在NVidia实现上做到这一点,因为每个属性的位置都是固定的(请参阅http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php "自定义属性"部分),不过我是不确定ATI实施中的位置.
此外,glGetAttribLocation
当尝试获取以"gl_"开头的任何属性的位置时,该函数将返回-1.
我想我错过了一些东西,这是一个微不足道的问题,但是我没有为ATI找到正确的解决方案.
目标独立光栅化 (TIR) 是DirectX 11.1 中的一项新硬件功能,Microsoft用它来改进 Windows 8 中的 Direct2D。AMD 声称TIR 将 2D 矢量图形的性能提高了约 500%。并且与 Nvidia 发生了一些“口水战”,因为Kepler GPU 显然不支持 TIR(以及其他 DirectX 11.1 功能)。TIR 的想法似乎起源于微软,因为他们已经为它申请了专利。
现在 Direct2D 很好,您的操作系统是 Windows,但是是否有一些 OpenGL(可能是供应商/AMD)扩展可以提供对相同硬件/驱动程序 TIR 的访问?我认为 AMD 的处境有点奇怪,因为 OpenGL 没有独立于供应商的 2D 矢量图形扩展;目前只有 Nvidia 正在推广NV_path_rendering,它的架构与 Direct2D 有很大不同。因此,与 Direct2D+Direct3D 世界不同,目前尚不清楚 AMD 为加速 2D 矢量图形而制作的任何东西可以插入(或显示)在 OpenGL 中的什么地方。我希望我的悲观情绪会被下面一个简单的答案所打破。
我实际上在这里发布了各种更新,因为在评论式帖子中没有足够的空间来做这个。关于 TIR 的作用似乎有点混乱,这不仅仅是“没有附加存储的帧缓冲区”。这可能是因为我只在上面链接了最糟糕的专利(但是这是我能在 TIR 上找到的最详细的文件)。我发现最好的 TIR 高级概述是以下来自Sinofsky 博客文章的片段:
为了提高渲染不规则几何体(例如地图上的地理边界)时的性能,我们使用了一种称为目标独立光栅化或 TIR 的新图形硬件功能。
TIR …
最近我更新了ATI驱动程序(Iam使用HD7970)到最新的驱动程序,我的一些OpenGL项目的objetcs停止工作.他们在nVidia最新驱动程序上工作的更多(在960米上测试).我应该知道ATI和nVidia渲染管道之间有什么区别吗?
附加信息:
当我尝试用三角形绘制时我什么都没看到,但是当我切换到GL_POINTS时,我看到绿点(碎片着色器的输出是纯绿色通道)正在按原样移动.这可能表明顶点着色器正在进行,因为正在发生MVP乘法.这些是具有一个大VBO的行星LOD对象,因此我使用一个函数来绑定所有缓冲区,而另一个函数用于绘制必要的高度图.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);
Run Code Online (Sandbox Code Playgroud)
通过polygonizator(计算着色器)填充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 …
Run Code Online (Sandbox Code Playgroud)