【问题标题】:GLSL - varying variable gets garbage value - GL_POINTSGLSL - 可变变量获取垃圾值 - GL_POINTS
【发布时间】:2012-06-29 23:40:08
【问题描述】:

奇怪的问题。似乎我的 GLSL 程序的行为与逻辑和规范建议的不同。这是垂直着色器:

#version 120

uniform mat4 q;
varying vec2 TextureCoord;

void main()
{
  gl_FrontColor = gl_Color;
  gl_TexCoord[0] = gl_MultiTexCoord0;
  vec4 p = q*gl_Vertex;
  TextureCoord = vec2(.01f,.01f);
  gl_Position= gl_ModelViewProjectionMatrix*p;
  gl_PointSize = gl_Normal.x / -p.z;
}

这是碎片着色器:

#version 120

uniform sampler2D theTex;
varying vec2 TextureCoord;

void main()
{
  vec2 realTexCoord = ( gl_TexCoord[0].st*vec2(0.024f,0.024f)) + TextureCoord;
  gl_FragColor = gl_Color*texture2D(theTex, realTexCoord);

}

皱纹是这个。如果我将 + TextureCoord 放在 frag 着色器中并用一些常量 vec2 替换它,例如 (.1f,.1f) 一切都很好,我会看到纹理。但像这样,我只会得到奇怪的垃圾颜色噪音。这是带有平滑点和纹理坐标替换的 GL_POINTS。我正在使用 TexCoord[0].st 因为 gl_PointCoord 始终为零...

看起来正在发生的事情是垃圾值以某种方式进入了我之间的变化。但是这怎么会发生呢?如果这些值以某种方式在顶点着色器和片段着色器之间“插值”,那么应用了什么样的逻辑?

我尝试在制服上发送值,但它也始终为零。

我正在使用 LWJGL。

【问题讨论】:

  • 您是否真的在检查着色器链接并编译信息日志中的错误?我认为在片段着色器中采样 gl_TexCoord 是不合法的。
  • 是的,我是。没关系,但对于这种乱码。我正在使用一些较旧的硬件,但仍然...

标签: java opengl glsl lwjgl


【解决方案1】:

什么是 GPU 硬件?您是否尝试过为其安装最新的驱动程序?您是否尝试过在来自不同供应商的 GPU 上运行您的代码?这可能是着色器之间未正确链接变量时的情况 - 这可能发生在一些有缺陷/旧的 OpenGL 实现上。

您是否尝试过使用 GL_TRIANGLE_STRIP?这里可能只有 GL_POINTS 拓扑错误。顺便提一句。纹理 GL_POINTS 对我来说是一个奇怪的想法。

变化是根据当前 gl_Position 通过基元插值的。对于 GL_POINTS,应该没有插值,因为每个组装的图元都有一个顶点。

【讨论】:

  • 当你想要生成粒子时,尤其是当物体像木头、石头甚至肉这样被破坏时,你想要根据被破坏物体的纹理来生成纹理粒子。您还可以将其用作生成烟雾、火焰等的快捷方式。
【解决方案2】:

我刚刚在使用旧的 ATI 卡时遇到了一些类似的问题。

您可以尝试在您的主程序中调用glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); - 为我修复了 gl_PointCoord。

我不确定这是否对你有用(我不知道为什么它对我有用......)但我的各种乱码问题已通过在我的片段着色器末尾添加行 _coord = gl_TexCoord[0].xy; 得到解决(_coord 是一个未使用的 vec2,我根本没有在其他任何地方调用 gl_TexCoord)。我在论坛上发现了这个建议,但我一辈子都找不到了!

【讨论】:

  • 有机会我会试一试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多