【问题标题】:GLSL UV (vec2) coords Optimised-outGLSL UV (vec2) coords 优化输出
【发布时间】:2015-05-18 12:27:34
【问题描述】:

我正在使用 OpenGL 4.3 和 GLSL 编写应用程序,我需要着色器来执行基本的 UV 映射。问题是 GLSL 编译器似乎正在优化 UV 坐标。我无法从应用程序端访问它们。

顶点着色器:

#version 330 core

uniform mat4 projection;

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 uvCoord;

out vec2 texCoord;

void main(void)
{
    texCoord = uvCoord;
    gl_Position = position;
}

顶点着色器:

#version 330 core

in vec2 texCoord;

out vec4 color;

uniform sampler2D tex;

void main(void)
{
    color = texture2D(tex, texCoord);
}

顶点和片段着色器都编译和链接没有错误,但是当我使用以下代码调用属性时:

GLint effectPositionLocation = glGetAttribLocation(effect->getEffect(), "position");
GLint effectUVLocation = glGetAttribLocation(effect->getEffect(), "uvCoord");

我得到 position 的 0 和 uvCoord 的 -1,所以我只能假设 uvCoord 已被优化,即使我使用它来将它从顶点着色器传递到片段着色器。

结果是显示几何体,但只有黑色,没有纹理映射。

我在 Direct3D 和 HLSL 中编写了类似的应用程序,没有属性被优化的问题。我在想这是一件简单的事情,我忘记了或没有做,但还没有发现。

【问题讨论】:

  • 为什么有两个顶点着色器?发布MCVE
  • @genpfault 看起来像是错字;第二个着色器看起来像片段着色器。
  • 源代码看起来正确,变量不应该被优化掉。你确定 getEffect() 给你正确的程序对象吗?
  • 您完全确定片段着色器可以编译?它不应该。 texture2D() 不是核心配置文件中的内置函数。只是texture()

标签: opengl glsl uv-mapping


【解决方案1】:

将“texture2D”替换为“texture”,您的属性将被使用。

错误的 GLSL 编译器:它不应该编译您的着色器,因为 texture2D 在核心配置文件中不可用。

【讨论】:

    【解决方案2】:

    编辑:您可能在设置glVertexAttribPointers 后忘记致电glEnableVertexAttribArray(1);

    【讨论】:

    • gl_TexCoord 在 330 版核心中不存在
    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2017-02-20
    • 2016-09-08
    • 1970-01-01
    • 2017-06-15
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多