簡體   English   中英

OpenGL紋理坐標問題

[英]OpenGL texture coordinates issue

我在OpenGL中遇到紋理映射問題。 我試圖將不同的紋理應用於場景中的不同對象,但是我發現將第二個紋理應用於第二個對象正在更改第一個對象的紋理坐標(我認為)。 這兩個對象是一個立方體和一個圓柱體。

僅啟用一個紋理,場景如下所示: 在此處輸入圖片說明

如果然后為1個或多個其他對象啟用紋理,我會看到這一點(我現在不太擔心“滾輪”上不良的紋理映射): 在此處輸入圖片說明

是什么原因造成的? 我的立方體和圓柱體的繪圖代碼如下:

立方體:

    //Alias the values for easier reading
double X = Position().X;
double Y = Position().Y;
double Z = Position().Z;
double W = _fWidth;
double H = _fHeight;
double D = _fDepth;

//Set textures if necessary
if(super._blHasTexture)
{
    super._obTexture.bind(gl);
}

_obTexture.enable(gl);
gl.glColor3f(0.5f, 0.5f, 0.7f);
//Draw

    gl.glBegin(GL2.GL_QUADS);
        //Front
    gl.glNormal3f(0f, 0f, 1f);
    gl.glVertex3d(X, Y, Z);     gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X+W, Y, Z);   gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X, Y-H, Z);   gl.glTexCoord2f(0f, 1f);

    //Back
    gl.glNormal3f(0f, 0f, -1f);
    gl.glVertex3d(X, Y, Z-D);   gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(0f, 1f);

    //Left
    gl.glNormal3f(-1f, 0f, 0f);
    gl.glVertex3d(X, Y, Z);     gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X, Y, Z-D);   gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X, Y-H, Z);   gl.glTexCoord2f(0f, 1f);            

    //Right
    gl.glNormal3f(1f, 0f, 0f);
    gl.glVertex3d(X+W, Y, Z);   gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(0f, 1f);

    //Top
    gl.glNormal3f(0f, 1f, 0f);
    gl.glVertex3d(X, Y, Z);     gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X+W, Y, Z);   gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X, Y, Z-D);   gl.glTexCoord2f(0f, 1f);

    //Bottom
    gl.glNormal3f(0f, -1f, 0f);
    gl.glVertex3d(X, Y-H, Z);   gl.glTexCoord2f(0f, 0f);
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(1f, 0f);
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f);
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(0f, 1f);
gl.glEnd();

_obTexture.disable(gl);

圓筒:

GLUquadric quad = glu.gluNewQuadric();
glu.gluQuadricTexture(quad, true);  

_obTexture.bind(gl);
_obTexture.enable(gl);

    //Draw the caps
gl.glBegin(GL2.GL_TRIANGLE_FAN);
    gl.glVertex3f(0f, 0f, 0.01f);
    gl.glTexCoord2f(0f, 0f);
    for(int t = 0; t < 20; t++)
    {
        float X = _fRadius * (float)Math.cos(t);
        float Y = _fRadius * (float)Math.sin(t);
        gl.glVertex3f(X, Y, 0.01f);
    }
    gl.glTexCoord2f(1f, 1f);
gl.glEnd();

gl.glBegin(GL2.GL_TRIANGLE_FAN);
    gl.glVertex3f(0f, 0f, -0.01f + _fHeight);
    gl.glTexCoord2f(0f, 0f);
    for(int t = 0; t < 20; t++)
    {
        float X = _fRadius * (float)Math.cos(t);
        float Y = _fRadius * (float)Math.sin(t);
        gl.glVertex3f(X, Y, -0.01f + _fHeight);
    }
        gl.glTexCoord2f(1f, 1f);
gl.glEnd();         

glu.gluCylinder(quad, _fRadius, _fRadius, _fHeight, 20, 1);
_obTexture.disable(gl);

在每次調用glVertex之前而不是之后分配紋理坐標-之后的調用適用於以下glVertex調用。

這樣做的方式是,在下一個渲染周期中將最后一個坐標集應用於第一個頂點(即多維數據集的一個角)-因此,渲染其他對象時會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM