为什么片段着色器不会编译?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么片段着色器不会编译?相关的知识,希望对你有一定的参考价值。
我在许多Windows 7和8 PC上使用了下面的片段着色器而没有任何问题。
#ifndef STRINGIFY
#define STRINGIFY(a) #a
#endif
char *fsFont = STRINGIFY(
precision mediump float;
varying vec2 v_texCoord;
vec2 v_texCoord;
uniform sampler2D s_texture;
uniform vec4 vColor4;
varying lowp vec4 DestinationColor;
void main()
{
gl_FragColor = vec4( 1, 1, 1, texture2D( s_texture, v_texCoord).a ) * vColor4;
}
);
最近我尝试在Windows 10机器上运行我的应用程序,当我尝试编译着色器时出现以下错误:
0x0059f3dc "0(1) : warning C7022: unrecognized profile specifier "mediump"
0(1) : warning C7022: unrecognized profile specifier "precision"
0(1) : error C1038: declaration of "v_texCoord" conflicts with previous declaration at 0(1)
0(1) : error C0000: syntax error, u"
如果我评论出precision mediump float
线..
0x0137f2c8 "0(1) : error C0000: syntax error, unexpected identifier, expecting "::" at token "lowp"
"
有什么问题?是因为我正在使用的PC支持不同版本的OpenGL而不是我期待的吗?
更新:This post建议精确媒体浮动线仅适用于OpenGL ES。这仍然无法解释为什么它适用于我的大多数PC。继续,lowp
宣言有什么问题?
这是我的SDL初始化代码,它选择OpenGL配置文件/版本:
#ifndef _WIN32
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
#else
// Use OpenGL 3.1 core
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
#endif
更新:这是更新的着色器,现在正在运行,感谢大家的评论:
char *fsFont =
"#version 330
"
"precision mediump float;
"
"varying vec2 v_texCoord;
"
"uniform sampler2D s_texture;"
"uniform vec4 vColor4;"
"varying lowp vec4 DestinationColor;"
"void main()"
"{"
"gl_FragColor = vec4( 1, 1, 1, texture2D( s_texture, v_texCoord).a ) * vColor4;"
"}"
;
更新:我已从所有着色器中删除了STRINGIFY,转移到OpenGL 3.3。我的所有着色器都编译为一个例外:
char *vs3DShader =
"#version 330
"
"layout (location = 0) in vec3 Position;"
"layout (location = 1) in vec4 color;"
"layout (location = 2) in vec3 normal;"
"out vec4 frag_color;"
"uniform mat4 transform;"
"void main()"
"{"
" gl_Position = transform * vec4( Position.x, Position.y, Position.z, 1.0 );"
" // Pass vertex color to fragment shader.."
" frag_color = color;"
"}"
;
错误:
0x0055f370 "(0) : error C0000: syntax error, unexpected $end at token "<EOF>"
"
答案
着色器无法编译,因为:
- 着色器源中没有
#version
行(版本未定义,可能是不同机器上的任何默认值) STRINGIFY()
宏不能与#
字符一起使用,所以最好将着色器作为文本从文件中加载,或者在每行左右用双引号指定它,记住在以'#
- 最好是每一行为了安全起见- 当试图删除
STRINGIFY()
时,必须在任何注释后添加换行符,否则注释后附加的所有内容都将被注释掉 - 在尝试找出为
mediump
和varying
关键字生成警告/错误的原因时引入了重复变量 - 必须使用正确的GLSL
#version
,对应于this table中genpfault指示的OpenGL版本(即OpenGL3.1必须使用#version 140
)
以上是关于为什么片段着色器不会编译?的主要内容,如果未能解决你的问题,请参考以下文章
片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变