C++ OpenGL着色器在AMD机器中无法正常工作

C++ OpenGL着色器在AMD机器中无法正常工作,c++,opengl,glew,glfw,C++,Opengl,Glew,Glfw,问题: 我有相同的OpenGL代码,可以在一台机器上正常工作,但在另一台机器上只能部分工作 很难调试,因为问题只发生在我需要部署的机器上。那台机器没有碰撞、警告、错误,。。没什么 到目前为止,我所尝试的: 在我的机器中,我安装了与第二台机器完全相同的O.S.和相同的库(以及相同的版本)。尽管如此,代码在我的机器上运行良好,而不是在我需要卸载应用程序的机器上。顺便说一句,我的机器有一个NVidia卡,另一个使用AMD 我在OpenGL everywhere中检查错误(使用glGetError

问题:

  • 我有相同的OpenGL代码,可以在一台机器上正常工作,但在另一台机器上只能部分工作

  • 很难调试,因为问题只发生在我需要部署的机器上。那台机器没有碰撞、警告、错误,。。没什么

到目前为止,我所尝试的:

  • 在我的机器中,我安装了与第二台机器完全相同的O.S.和相同的库(以及相同的版本)。尽管如此,代码在我的机器上运行良好,而不是在我需要卸载应用程序的机器上。顺便说一句,我的机器有一个NVidia卡,另一个使用AMD

  • 我在OpenGL everywhere中检查错误(使用glGetError),但没有找到任何东西

  • 我的应用程序有两部分,一部分使用固定管道渲染,另一部分使用着色器。着色器渲染是其中一个中不存在的部分。着色器在这两台计算机中都成功编译,其日志不显示任何内容(使用glGetShaderInfoLog)

  • 我没有其他机器(除了那2台)做进一步的测试,看看问题是否真的是硬件

视频卡:

  • 我的机器:NVidia Quadro 600-(驱动程序版本:319.17)

  • 部署计算机:AMD FirePro W8000

复制的

  • 我已经检查过了,但是对于我的应用程序,着色器在AMD机器中正确编译
代码:

我使用GLFW/GLEW

GLFW和GLEW初始化

if (!glfwInit())
    return;
GLFWwindow * window = glfwCreateWindow(wndWidth, wndHeight, "Window", NULL, NULL);
if (!window){
    glfwTerminate();
    return;
}
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK){
    std::cout << "ERROR: glewInit failed!" << std::endl;
    return;
}
初始化VBO

glGenBuffers(3, buffers);
//Vertices
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, num_vertices*3, attr_vertices.data(), GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//Color
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glBufferData(GL_ARRAY_BUFFER, num_vertices*4, attr_colors.data(), GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
//Size
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glBufferData(GL_ARRAY_BUFFER, num_vertices*1, attr_size.data(), GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, 0);
着色器

std::string vertexSRC = "#version 120\n"
    "attribute vec3 vertex;\n"
    "attribute vec4 color;\n"
    "attribute float size;\n"
    "uniform mat4 matrix;\n"
    "uniform vec4 bb;\n"
    "uniform float size_mod;\n"
    "varying vec4 vColor;\n"        
    "void main(void)\n"
    "{\n"
    "    vec3 w = vec3((vertex.x-bb.x)/bb.z*2-1, (vertex.y-bb.y)/bb.w*2-1, vertex.z);\n"
    "    gl_Position = vec4(w, 1.0);\n"
    "    vColor = color;\n"
    "    gl_PointSize = size*size_mod;\n"
    "}\n";
std::string fragmentSRC = "#version 120\n"
    "varying vec4 vColor;\n"
    "uniform sampler2D texture;\n"
    "void main()\n"
    "{\n"
    "    vec4 w = texture2D(texture, vec2(gl_PointCoord.x, 1.0-gl_PointCoord.y)) * vColor;\n"
    "    gl_FragColor = w;\n"
    "}\n";
初始化着色器

vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar * vtx = vertexSRC.c_str();
const GLchar * frg = fragmentSRC.c_str();
glShaderSource(vertexShader, 1, &vtx, NULL);
glShaderSource(fragmentShader, 1, &frg, NULL);
GLint vst, fst;
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vst);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fst);
if (vst != GL_TRUE || fst != GL_TRUE){
    std::cout << "ERROR compiling shaders: " << vst << " " << fst << std::endl;
    return;
}
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
渲染调用

glEnable(GL_POINT_SPRITE);
glEnable(GL_PROGRAM_POINT_SIZE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(shaderProgram);

//Vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//Color
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
//Size
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, 0);

glUniformMatrix4fv(l_matrix, 1, true, m);
glUniform4fv(l_bbLocation, 1, latlng_bb);
glUniform1f(l_sizeMod, GLfloat(zoom*size_mod/9.0));

//RENDER
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[face]);
glUniform1i(l_texture, 0);

glDrawArrays(GL_POINTS, 0, num_vertices);
glUseProgram(0);

//DISABLE
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

glDisable(GL_POINT_SPRITE);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, 0);
任何能帮助我找出问题所在的想法、技巧和方法都是受欢迎的

编辑0

添加了有关视频卡的更多信息

编辑1

我只是对vertex Shader中的
#version 120
行进行了注释,并得到了一些警告:

0(10):警告C7011:从“int”隐式转换为“float”

刚把这行改成下面的。警告已消失,但仍存在相同的问题


vec3 w=vec3((顶点x-bb.x)/bb.z*2.0-1.0,(顶点y-bb.y)/bb.w*2.0-1.0,顶点z)\n

我必须做两件事来解决这个问题

首先,为了使它与AMD卡一样工作,我必须获得并使用AttriblLocation

更改自:

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
致:

它没有显示数据,因为大小/顶点/颜色是混合的

之后,它在我的Nvidia卡中停止工作。编译着色器时未收到任何错误。尽管如此,每次尝试使用着色器时都会出现错误(使用glGetError)。
我回去后意识到我必须从着色器中删除所有未使用的变量。

你说“我的机器有一个NVidia卡,另一个使用AMD”是什么意思?哪个图形芯片在另一个上?ATI?可能是图形驱动程序issue@B这张卡是AMD FirePro W8000,
size\u mod*size
的值是多少?是否在
GLfloat pt_size_min_max[2]的范围内;glGetFloatv(总包点大小范围,总包大小最小最大值)?我注意到您在编译后提到了
glGetShaderInfoLog(…)
,但您在链接后是否尝试过
glGetProgramInfoLog(…)
?那里可能有一些相关的信息。当你自己解决问题时,请写下来作为答案并接受。
glEnable(GL_POINT_SPRITE);
glEnable(GL_PROGRAM_POINT_SIZE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(shaderProgram);

//Vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//Color
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
//Size
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, 0);

glUniformMatrix4fv(l_matrix, 1, true, m);
glUniform4fv(l_bbLocation, 1, latlng_bb);
glUniform1f(l_sizeMod, GLfloat(zoom*size_mod/9.0));

//RENDER
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[face]);
glUniform1i(l_texture, 0);

glDrawArrays(GL_POINTS, 0, num_vertices);
glUseProgram(0);

//DISABLE
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

glDisable(GL_POINT_SPRITE);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
l_vertex = glGetAttribLocation(shaderProgram, "vertex");
glEnableVertexAttribArray(l_vertex);
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glVertexAttribPointer(l_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);