gpt4 book ai didi

c++ - Mac 上的 OpenGL GLSL 着色器无法编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:23 26 4
gpt4 key购买 nike

当我尝试在 Mac 上为我的应用程序编译 GLSL 着色器时,它因着色器版本冲突错误而失败:

Error compiling vertex shader:
ERROR: 0:1: '' : version '130' is not supported

Error compiling shader:
ERROR: 0:1: '' : version '130' is not supported

着色器是这样的:

顶点着色器:

#version 130

in vec2 in_vPos;
in vec2 in_vTexCoord;

out vec2 s_vTexCoord;

void main()
{
gl_Position = vec4(in_vPos, 0, 1);
s_vTexCoord = (in_vTexCoord + vec2(1, 1)) / 2;
}

片段着色器:

#version 130

in vec2 s_vTexCoord;

out vec4 s_colOut;

uniform sampler2DRect s_texSampler;
uniform vec4 s_colBlend;

void main()
{
vec4 pixel = texture(s_texSampler, s_vTexCoord * textureSize(s_texSampler));
s_colOut = s_colBlend * pixel;
}

这就是我初始化 SDL 渲染器和 Glew 的方式:

  ren_pRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
glEnable(GL_MULTISAMPLE);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);

SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");

static bool _bInitializedGlew = false;
if(!_bInitializedGlew) {
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if(err != GLEW_OK) {
printf("Glew initialization error: %d\n", err);
}
_bInitializedGlew = true;
}

这就是我编译着色器的方式:

unsigned int CShader::CompileShader(const char* str, int type, bool &bSuccess)
{
// create a new shader
GLuint iShader = glCreateShader(type);
const GLchar* aSourceVertex[] = { str };
glShaderSource(iShader, 1, aSourceVertex, NULL);
glCompileShader(iShader);

// check if compiling went okay
GLint bShaderCompiled = GL_FALSE;
glGetShaderiv(iShader, GL_COMPILE_STATUS, &bShaderCompiled);
if(bShaderCompiled != GL_TRUE) {
// it did not.
printf("Error compiling %sshader:\n", (type == GL_VERTEX_SHADER ? "vertex " : ""));
int iLogLength = 0;
int iMaxLength = 0;
glGetShaderiv(iShader, GL_INFO_LOG_LENGTH, &iMaxLength);
char* buffer = new char[iMaxLength];
glGetShaderInfoLog(iShader, iMaxLength, &iLogLength, buffer);
if(iLogLength > 0) {
printf("%s\n", buffer);
}
delete[] buffer;

// report it back
bSuccess = false;
// and delete the shader
glDeleteShader(iShader);
} else {
// it worked!
bSuccess = true;
}

// return shader
return iShader;
}

我之前四处寻找答案,但找不到可以帮助我的决定性 Stackoverflow 答案,尽管它确实用 SDL_GL_SetAttribute 为我指明了正确的方向,用于设置 GL 版本和核心配置文件。所以在上面的代码中,我将它设置为 3.1 Core,according to Wikipedia , 是 #version 140,但即使我使用它,我也会得到同样的错误:

Error compiling vertex shader:
ERROR: 0:1: '' : version '140' is not supported

Error compiling shader:
ERROR: 0:1: '' : version '140' is not supported

编辑:我将属性中的版本更改为 3.2 Core + Forward Compat,现在使用 #version 150 我遇到了同样的问题,说不支持 150。

当我打印 glGetString(GL_SHADING_LANGUAGE_VERSION) 的结果时,我得到 1.20

即使我在创建 SDL 窗口后显式创建上下文,它仍然报告 1.20:

win_pWindow = SDL_CreateWindow(strTitle, iX, iY, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | ulFlags);
win_pContext = SDL_GL_CreateContext(win_pWindow);
printf("GLSL version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));

最佳答案

嗯,那个错误信息怎么样:

Error compiling vertex shader:
ERROR: 0:1: '' : version '130' is not supported

这正是您的问题所在。 GLSL 1.30版本与OpenGL-3.0相关;由于该版本中没有核心/兼容性配置文件,因此 MacOS X 不支持它。

当谈到现代 OpenGL 时,MacOS X 只支持 core 配置文件。因此,您需要核心配置文件上下文,并且必须使用核心配置文件版本编写着色器。 OpenGL-3核心配置文件仅随OpenGL-3.2引入,对应的GLSL版本为1.50。所以你必须在那里写#version 150

关于c++ - Mac 上的 OpenGL GLSL 着色器无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31803872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com