GLSL编译的奇葩问题。。。求大神解答啊。。。。

baidu_32495553 2015-11-09 03:29:57
明明顶点着色器代码中有一大段都是注释掉的无用部分来的(如下)。。。。。
但是为何我删掉注释掉的部分后,就发生编译错误了呢?真的好晕啊。。。。


vShader,glsl(顶点着色器):

#version 150

in vec4 vPosition;
in vec4 vColor;
out vec4 color;



void main()
{

//vec3 angles = radians( theta );
//vec3 c = cos( angles );
//vec3 s = sin( angles );

// Remeber: thse matrices are column-major
//mat4 rx = mat4( 1.0, 0.0, 0.0, 0.0,
//0.0, c.x, s.x, 0.0,
//0.0, -s.x, c.x, 0.0,





color = vColor;
gl_Position = vPosition;
}





fShader.glsl(片元着色器)

#version 150

in vec4 color;
out vec4 fColor;

void main()
{
fColor = color;
}






错误如下:

...全文
568 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
A-SHIN 2018-05-08
  • 打赏
  • 举报
回复
FILE* fp = fopen(shaderFile, "rb");
这家人 2015-12-03
  • 打赏
  • 举报
回复
楼主你最后是怎么改的呢?
baidu_32495553 2015-11-13
  • 打赏
  • 举报
回复
引用 7 楼 redui 的回复:
应该是读取shader源码的代码出问题了,仔细检查一下读出来的内容是否跟实际吻合,比如文本长度是否一致,结尾不要包含无关内容,在合适的地方加空结束符。
对的。。后来发现了是因为,我用文本的形式打开了文件,而百度之后,有人指出了,fread这个函数,如果是处理文本形式打开的文件的很容易出错,改成以二进制形式打开文件之后,就解决了。
redui 2015-11-10
  • 打赏
  • 举报
回复
应该是读取shader源码的代码出问题了,仔细检查一下读出来的内容是否跟实际吻合,比如文本长度是否一致,结尾不要包含无关内容,在合适的地方加空结束符。
injuer 2015-11-09
  • 打赏
  • 举报
回复
fColor 需要使用location[()]关键字声明.
baidu_32495553 2015-11-09
  • 打赏
  • 举报
回复
那么可能就是我的着色器初始化函数的问题了? 初始化函数如下

#include "Angel.h"

namespace Angel {

// Create a NULL-terminated string by reading the provided file
static char*
readShaderSource(const char* shaderFile)
{
    FILE* fp = fopen(shaderFile, "r");

    if ( fp == NULL ) { return NULL; }

    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
    char* buf = new char[size + 1];
    fread(buf, 1, size, fp);

    buf[size] = '\0';
    fclose(fp);

    return buf;
}


// Create a GLSL program object from vertex and fragment shader files
GLuint
InitShader(const char* vShaderFile, const char* fShaderFile)
{
    struct Shader {
	const char*  filename;
	GLenum       type;
	GLchar*      source;
    }  shaders[2] = {
	{ vShaderFile, GL_VERTEX_SHADER, NULL },
	{ fShaderFile, GL_FRAGMENT_SHADER, NULL }
    };

    GLuint program = glCreateProgram();
    
    for ( int i = 0; i < 2; ++i ) {
	Shader& s = shaders[i];
	s.source = readShaderSource( s.filename );
	if ( shaders[i].source == NULL ) {
	    std::cerr << "Failed to read " << s.filename << std::endl;
	    exit( EXIT_FAILURE );
	}

	GLuint shader = glCreateShader( s.type );
	glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
	glCompileShader( shader );

	GLint  compiled;
	glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
	if ( !compiled ) {
		std::cerr << s.source<< std::endl;
	    /*GLint  logSize;
	    glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logSize );
	    char* logMsg = new char[logSize];
	    glGetShaderInfoLog( shader, logSize, NULL, logMsg );
	    std::cerr << logMsg << std::endl;
	    delete [] s.source;
		delete [] logMsg;*/

	    exit( EXIT_FAILURE );
	}

	delete [] s.source;

	glAttachShader( program, shader );
    }

    /* link  and error check */
    glLinkProgram(program);

    GLint  linked;
    glGetProgramiv( program, GL_LINK_STATUS, &linked );
    if ( !linked ) {
	std::cerr << "Shader program failed to link" << std::endl;
	GLint  logSize;
	glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logSize);
	char* logMsg = new char[logSize];
	glGetProgramInfoLog( program, logSize, NULL, logMsg );
	std::cerr << logMsg << std::endl;
	delete [] logMsg;

	exit( EXIT_FAILURE );
    }

    /* use program object */
  

    return program;
}

}  // Close namespace Angel block



baidu_32495553 2015-11-09
  • 打赏
  • 举报
回复
我好像找到出错原因了。。。。不过还是不明白为什么会出这样的错啊。。。求大神解释下啊。。。

我把编译失败的操作,设置成了输出错后的GLSL内容字符串,结果把上面的语句上下移动(就是换行,加空格什么的),

一定情况下。。。会出现这样的奇葩问题(为什么vShader字符串的一部分跑到fShader这边来了!?)。。。






baidu_32495553 2015-11-09
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
你需要指定命名空间等
不懂啊。。。。我是刚刚接触一天的渣。。。。
赵4老师 2015-11-09
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
oyljerry 2015-11-09
  • 打赏
  • 举报
回复
你需要指定命名空间等

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧