C++ GLSL链接在没有有用信息的情况下失败

C++ GLSL链接在没有有用信息的情况下失败,c++,opengl,glsl,C++,Opengl,Glsl,类似的问题:但在我的例子中,顶点着色器和片段着色器都非常简单,输入/输出变量匹配如下所示 [编辑]加载着色器的代码将进一步列出。 由于VS2010不支持基于范围的for循环,部分代码是#ifdef'd。 但无论如何。。。我已经在MinGW 32位环境中尝试了该代码,它链接正常 着色器链接在使用VS2010构建时成功并运行良好,但在使用NetBeans+MinGW-w64时失败,并给出以下日志消息: Link info --------- No shader objects attached.

类似的问题:但在我的例子中,顶点着色器和片段着色器都非常简单,输入/输出变量匹配如下所示

[编辑]加载着色器的代码将进一步列出。 由于VS2010不支持基于范围的for循环,部分代码是
#ifdef
'd。 但无论如何。。。我已经在MinGW 32位环境中尝试了该代码,它链接正常

着色器链接在使用VS2010构建时成功并运行良好,但在使用NetBeans+MinGW-w64时失败,并给出以下日志消息:

Link info
---------
No shader objects attached.
它可能与MinGW-w64 OpenGL库有关吗

这是我的顶点着色器,和

#version 330

in vec4 vPosition;
in vec4 vColor;

out vec4 color;

void main()
{
    color = vColor;
    gl_Position = vPosition;
}
这是我的片段着色器

#version 330

in vec4 color;
out vec4 fColor;

void main()
{
    fColor = color;
}
LoadShader.h:

typedef struct {
    GLenum       type;
    const char*  filename;
    GLuint       shader;
} ShaderInfo;
main.cpp:

vector<ShaderInfo> shaders;
ShaderInfo vert = {GL_VERTEX_SHADER, "SimpleVertexShader.vert"};
ShaderInfo frag = {GL_FRAGMENT_SHADER, "SimpleFragmentShader.frag"};
shaders.push_back(vert);
shaders.push_back(frag);

program = LoadShaders(shaders);
矢量着色器;
ShaderInfo vert={GL_VERTEX_SHADER,“SimpleVertexShader.vert”};
ShaderInfo frag={GL_FRAGMENT_SHADER,“SimpleFragmentShader.frag”};
着色器。向后推(垂直);
着色器。推回(frag);
程序=加载着色器(着色器);
LoadShader.cpp-LoadShaders()

GLuint加载着色器(向量着色器)
{
if(shaders.empty())返回0;
#如果!已定义(_MSC_VER)| 1600<_MSC_VER
用于(自动输入:着色器)
entry.shader=CreateShader(entry.type,entry.filename);
#否则
对于(vector::iterator entry=shaders.begin();entry!=shaders.end();++entry)
条目->着色器=CreateShader(条目->类型,条目->文件名);
#恩迪夫
//创建程序
返回CreateProgram(着色器);
}
LoadShader.cpp-CreateShader()

GLuint CreateShader(GLenum shaderType,常量字符*着色器文件路径)
{
//创建着色器
GLuint shaderID=glCreateShader(shaderType);
如果(!shaderID)
返回0;
//从文件中读取着色器代码
std::字符串着色器代码;
std::ifstream shaderStream(着色器文件路径,std::ios::in);
if(shaderStream.is_open())
{
std::string Line=“”;
while(getline(shaderStream,Line))
着色器代码+=“\n”+行;
shaderStream.close();
}
//编译着色器
printf(“编译着色器:%s\n”,着色器文件路径);
char const*sourcePointer=shaderCode.c_str();
glShaderSource(shaderID,1和sourcePointer,NULL);
glCompileShader(shaderID);
//检查着色器
闪烁编译;
glGetShaderiv(shaderID、GL\u编译状态和编译状态);
如果(!编译){
葛思哲伦;
glGetShaderiv(shaderID、GL\u INFO\u LOG\u LENGTH和len);
GLchar*log=新的GLchar[len+1];
glGetShaderInfoLog(shaderID、len和len、log);

STR::CERP RP< >我认为你在代码< >加载着色器< /代码>中有错误。循环的C++ 11版本:

for (auto entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);
获取
着色器
中每个项的副本,因此向量中的元素将不会更新。请改为尝试:

for (auto &entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);

顺便说一下,如果你想支持旧的编译器,你不妨只使用旧版本的循环。

< P>我认为你在代码< >加载着色器< /C>中有一个错误。C++的11版本的循环:

for (auto entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);
获取
着色器
中每个项的副本,因此向量中的元素将不会更新。请改为尝试:

for (auto &entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);

顺便说一下,如果你想支持旧的编译器,你不妨只使用旧版本的循环。

< P>我认为你在代码< >加载着色器< /C>中有一个错误。C++的11版本的循环:

for (auto entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);
获取
着色器
中每个项的副本,因此向量中的元素将不会更新。请改为尝试:

for (auto &entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);

顺便说一下,如果你想支持旧的编译器,你不妨只使用旧版本的循环。

< P>我认为你在代码< >加载着色器< /C>中有一个错误。C++的11版本的循环:

for (auto entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);
获取
着色器
中每个项的副本,因此向量中的元素将不会更新。请改为尝试:

for (auto &entry : shaders)
    entry.shader = CreateShader(entry.type, entry.filename);


顺便说一句,如果你想支持旧的编译器,你最好使用旧版本的循环。

你能发布编译和链接着色器的代码吗?我支持GuyRT的请求。但这是一个猜测游戏。此外,如果着色器源不是内联的,而是从外部文件读取的,请发布加载代码。我已经添加了代码。它相当长。与您的问题没有直接关系-但是为什么所有这些都与#define'es有关?如果您必须支持非C++11目标,您必须使用旧的非自动版本,并且它可以在任何地方编译,甚至在新的编译器上;那么为什么您也要编写自动版本呢?您只是大大增加了出错的机会我不知道数量。这不是一个生产代码,有一定的理由明确表示这两种方式。很抱歉代码混乱,但不想为这个问题排除代码。你能发布你的代码来编译和链接着色器吗?我支持GuyRT的请求。但这是一个猜测游戏。此外,如果着色器源不是内联的,而是真实的从外部文件,请张贴加载代码。我已经添加了代码。它相当长。与您的问题没有直接关系-但为什么所有这些都与定义混乱?如果您必须支持非C++11目标,您必须使用旧的非自动版本,它可以在任何地方编译,甚至在新的编译器上;为什么您也要编写自动版本嗯?你只是增加了相当大的错误几率。这不是一个生产代码,有一定的理由明确表示这两种方式。很抱歉代码混乱,但不想考虑问题的代码。你能发布你的代码来编译和链接着色器吗?我支持GuyRT的请求。但这是一个猜测游戏。此外,如果着色器源不是内联的,而是从外部文件读取的,请发布加载代码。我已经添加了代码。它相当长。与您的问题没有直接关系-但是为什么所有这些都与#define'es有关?如果您必须支持非C++11目标,您必须使用旧的非自动版本,并且它可以在任何地方编译,例如即使是在新的编译器上,那你为什么还要写自动版本呢?你只是增加了出错的机会