GLSL 着色器 运行 在 Intel 的集成 GPU 上完美,但在 NVIDIA 上没有
GLSL Shaders run perfect on Intel's integrated GPU but nothing on NVIDIA
我正在使用几何着色器进行几何放大。
该代码在 Windows 和 OS X.
中与 Intel 显卡完美运行
我将配置更改为使用我的 windows 机器上的专用 NVIDIA GPU aaaaaaaaaa...什么都没有。
此代码:
void testError(std::string src) {
GLenum err = glGetError();
if (err != GL_NO_ERROR){
printf("(%s) Error: %s %d\n", src.c_str(), gluErrorString(err), err);
}
}
...
printf("glIsProgram: %s\n", glIsProgram(shaderProgram)?"True":"false");
glUseProgram(shaderProgram);
testError("GOGO 111");
GLint isLinked = 0;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
if (isLinked == GL_FALSE)
{
GLint maxLength = 0;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
//The maxLength includes the NULL character
std::vector<GLchar> infoLog(maxLength);
glGetProgramInfoLog(shaderProgram, maxLength, &maxLength, &infoLog[0]);
printf("Program Not Linked %d:\n %s\n", maxLength, infoLog);
//We don't need the program anymore.
glDeleteProgram(shaderProgram);
//Use the infoLog as you see fit.
//In this simple program, we'll just leave
return 0;
}
输出:
glIsProgram: True
(GOGO 111) Error: invalid operation 1282
Program Not Linked 116:
Ð
日志也有一个奇怪的行为,因为它什么都不打印,但长度为 116。
谢谢。
编辑
这个:
char * infoLog;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
打印出结果。
Program Not Linked 116:
Geometry info
-------------
(0) : error C6033: Hardware limitation reached, can only emit 128 vertices of this size
来自:
const GLchar* geometryShaderSrc = GLSL(
layout(points) in;
layout(triangle_strip, max_vertices = 256) out;
...
奇怪的是,Intel 集成 GPU 的硬件(内存?)仿制品少于 NVIDIA GPU。
在不减少顶点的情况下解决这个问题的任何解决方案?
您似乎超出了 GEOMETRY_TOTAL_OUTPUT_COMPONENTS
限制。
在 OpenGL 4.4 Spec - 第 11.3.4.5 节 - 第 388 页
The product of the total number of vertices and the sum of all
components of all active output variables may not exceed the value of MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
. LinkProgram
will fail if it determines
that the total component limit would be violated.
即max_vertices
不能超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / number_of_components
最低要求详见 Table 23.60 - 第 585 页
GEOMETRY_TOTAL_OUTPUT_COMPONENTS 1024
好像你有8个组件,所以只能有128个顶点。您必须减少组件数或减少顶点数。
在每个设备上检查 GEOMETRY_TOTAL_OUTPUT_COMPONENTS
的值以确保。
我正在使用几何着色器进行几何放大。 该代码在 Windows 和 OS X.
中与 Intel 显卡完美运行我将配置更改为使用我的 windows 机器上的专用 NVIDIA GPU aaaaaaaaaa...什么都没有。
此代码:
void testError(std::string src) {
GLenum err = glGetError();
if (err != GL_NO_ERROR){
printf("(%s) Error: %s %d\n", src.c_str(), gluErrorString(err), err);
}
}
...
printf("glIsProgram: %s\n", glIsProgram(shaderProgram)?"True":"false");
glUseProgram(shaderProgram);
testError("GOGO 111");
GLint isLinked = 0;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
if (isLinked == GL_FALSE)
{
GLint maxLength = 0;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
//The maxLength includes the NULL character
std::vector<GLchar> infoLog(maxLength);
glGetProgramInfoLog(shaderProgram, maxLength, &maxLength, &infoLog[0]);
printf("Program Not Linked %d:\n %s\n", maxLength, infoLog);
//We don't need the program anymore.
glDeleteProgram(shaderProgram);
//Use the infoLog as you see fit.
//In this simple program, we'll just leave
return 0;
}
输出:
glIsProgram: True
(GOGO 111) Error: invalid operation 1282
Program Not Linked 116:
Ð
日志也有一个奇怪的行为,因为它什么都不打印,但长度为 116。
谢谢。
编辑 这个:
char * infoLog;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
打印出结果。
Program Not Linked 116:
Geometry info
-------------
(0) : error C6033: Hardware limitation reached, can only emit 128 vertices of this size
来自:
const GLchar* geometryShaderSrc = GLSL(
layout(points) in;
layout(triangle_strip, max_vertices = 256) out;
...
奇怪的是,Intel 集成 GPU 的硬件(内存?)仿制品少于 NVIDIA GPU。 在不减少顶点的情况下解决这个问题的任何解决方案?
您似乎超出了 GEOMETRY_TOTAL_OUTPUT_COMPONENTS
限制。
在 OpenGL 4.4 Spec - 第 11.3.4.5 节 - 第 388 页
The product of the total number of vertices and the sum of all components of all active output variables may not exceed the value of
MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
.LinkProgram
will fail if it determines that the total component limit would be violated.
即max_vertices
不能超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS / number_of_components
最低要求详见 Table 23.60 - 第 585 页
GEOMETRY_TOTAL_OUTPUT_COMPONENTS 1024
好像你有8个组件,所以只能有128个顶点。您必须减少组件数或减少顶点数。
在每个设备上检查 GEOMETRY_TOTAL_OUTPUT_COMPONENTS
的值以确保。