在OpenGL ES 2.0中使用glTexGen

我一直试图用GL_OBJECT_LINEAR实现glTexGen的GLSL替换几个小时。 对于OpenGL ES 2.0。 在Ogl GLSL中有gl_TextureMatrix,这使得它更容易,但这在OpenGL ES 2.0 / OpenGL ES Shader Language 1.0中不可用

有几个网站提到,在GLSL垂直着色器中这应该是“容易的”。 但我无法让它工作。

我的直觉是,我没有正确地设置飞机,或者我在理解中错过了一些东西。

我在网上看到了。 但大多数网站都在谈论投影纹理,我只是想在平面投影的基础上创建UV。 这些模型正在玛雅建造,有五万多个多边形,建模者使用平面图,但Maya不会输出UV。 所以我想弄明白这一点。

我查看了glTexGen手册页信息:

g = p1xo + p2yo + p3zo + p4wo

什么是g? g是texture2d调用中s的值吗?

我看过这个网站:

http://www.opengl.org/wiki/Mathematics_of_glTexGen

另一个大小解释了相同的功能:

坐标= P1 * X + P2 * Y + P3 * Z + P4 * W

我不明白coord(我脑海中的UV vec2)等于点积(一个标量值)吗? 同样的问题,我以前用“g”。

我该如何设置飞机? 在我的opengl c ++ 3.0代码中,我将它设置为[0,0,1,0](基本上单位为z),并且glTexGen工作得很好。

我仍然错过了一些东西。

我的垂直着色器看起来基本上是这样的:WVPMatrix = World View Project Matrix。 POSITION是模型的顶点位置。

varying vec4 kOutBaseTCoord;
void main()
{
    gl_Position = WVPMatrix * vec4(POSITION, 1.0);

    vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
    vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
    vec4 rPlane = vec4(0.0, 0.0, 0.0, 0.0);
    vec4 qPlane = vec4(0.0, 0.0, 0.0, 0.0);

    kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
    kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
    //kOutBaseTCoord.r = dot(vec4(POSITION, 1.0), rPlane);
    //kOutBaseTCoord.q = dot(vec4(POSITION, 1.0), qPlane);

}

碎片着色器

precision mediump float;
uniform sampler2D BaseSampler;
varying mediump vec4 kOutBaseTCoord;
void main()
{

    //gl_FragColor = vec4(kOutBaseTCoord.st, 0.0, 1.0);
    gl_FragColor = texture2D(BaseSampler, kOutBaseTCoord.st);
}

我已经尝试了frag着色器中的texture2DProj

以下是我查阅的其他一些链接

http://www.gamedev.net/topic/407961-texgen-not-working-with-glsl-with-fixed-pipeline-is-ok/

先谢谢你。


来自glTexGen文档::

void glTexGenfv ( GLenum coord , GLenum pname , const GLfloat *params );

  • coord - 指定纹理坐标。 必须是GL_S,GL_T,GL_R或GL_Q中的一个。
  • pname - 如果纹理生成函数是GL_OBJECT_LINEAR,则该函数
  • g = p1 xo + p2 yo + p3 zo + p4 wo

    被使用,其中g是为在coord中命名的坐标计算的值,...

    所以g的确是一个标量值,它可以是vec2 uv值的s或t分量,取决于coord的值(GL_S或GL_T)。

    更明确地说,呼叫

    glTexGen(GL_S, GL_OBJECT_LINEAR, {ps0,ps1,ps2,ps3})
    glTexGen(GL_T, GL_OBJECT_LINEAR, {pt0,pt1,pt2,pt3})
    

    类似于

    vec4 sPlane = vec4(ps0,ps1,ps2,ps3);
    vec4 tPlane = vec4(pt0,pt1,pt2,pt3);
    kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
    kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
    

    根据POSITION值的比例,输出的st坐标可能在(0,1)范围之外。 使用你的价值观:

    vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
    vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
    

    将直接将模型顶点的x坐标映射到纹理坐标的s值,对于y和t也是如此。 因此,如果您的模型的坐标范围在(0,1)之外,则会出现UV值。

    为了使纹理适合您的模型,您必须将投影的比例调整为模型的大小。 对于100.0的示例模型大小,这将给出以下代码:

    float MODEL_SIZE = 100.0;
    vec4 sPlane = vec4(1.0/MODEL_SIZE, 0.0, 0.0, 0.0);
    vec4 tPlane = vec4(0.0, 1.0/MODEL_SIZE, 0.0, 0.0);
    

    如果您的模型以(0,0,0)为中心,此解决方案仍然可以为您提供<0的值。 为了调整这一点,你可以为产生的UV值添加一个偏移量。 如 :

    kOutBaseTCoord.st += vec(0.5);
    

    请注意,所有这些都依赖于应用程序,以及您尝试使用纹理投影实现的功能。 不要犹豫,调整你的公式来满足你的需求,这就是着色器的作用!

    链接地址: http://www.djcxy.com/p/33595.html

    上一篇: glTexGen in OpenGL ES 2.0

    下一篇: Entity Framework Many to Many Clear doesnt Detach?