簡體   English   中英

球體紋理貼圖(opengl和c ++)

[英]Sphere texture mapping (opengl and c++)

我正在嘗試向球體添加紋理,它可以工作,但我一直收到錯誤。 下面是我得到的圖片,

在此輸入圖像描述

我不知道這個GL error: Invalid operation是什么GL error: Invalid operation錯誤是指。 我認為這與我的代碼有關。 我不確定我是否正確地讀取了我的文件。

這是我用來繪制這個球體的代碼。

glTranslate(0.0f, 0.0f, 0.0f);
glRotate(sunRot,0.0,0.0,1.0);
drawAroundPlanetGrid(100, 1, 50, 50, 1);
glPopMatrix();`

這是drawAroundPlanetGrid()樣子。

void drawAroundPlanetGrid(double radius, int overSample, int numStrips, int numQuads, float radiusRatio)
{
GLMaterial test;
GLuint surf;
GLuint* surface;
Images::RGBImage surfaceImage;

surfaceImage=Images::readImageFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png",Vrui::openFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png"));

glEnable(GL_TEXTURE_2D);

//glGenTextures(1, surface);

glBindTexture(GL_TEXTURE_2D, surf);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);

double b = radius * 0.9966463577;//Geoid's semi-minor axis
double e2 = 0.0067; //Geoid's squared eccentricity, derived from flattening factor

float texY1=float(0)/float(numStrips);
double lat1=(Math::Constants<double>::pi*double(0))/double(numStrips)-0.5*Math::Constants<double>::pi;
double s1=Math::sin(lat1);
double c1=Math::cos(lat1);
double chi1=Math::sqrt(1.0-e2*s1*s1);
double xy1=radius*radiusRatio/chi1*c1;
double z1=radius*(1.0-e2)/chi1*s1;

//* Draw latitude quad strips: *
for(int i=1;i<numStrips+1;++i)
    {
    float texY0=texY1;
    double s0=s1;
    double c0=c1;
    double xy0=xy1;
    double z0=z1;
    texY1=float(i)/float(numStrips);
    lat1=(Math::Constants<double>::pi*double(i))/double(numStrips)-0.5*Math::Constants<double>::pi;
    s1=Math::sin(lat1);
    c1=Math::cos(lat1);
    chi1=Math::sqrt(1.0-e2*s1*s1);
    xy1=radius/chi1*c1;
    z1=radius*(1.0-e2)/chi1*s1;

    glBegin(GL_QUAD_STRIP);
    for(int j=0;j<=numQuads;++j)
    {
    float texX=float(j)/float(numQuads)+0.5f;
    double lng=(2.0*Math::Constants<double>::pi*double(j))/double(numQuads);
    double cl=Math::cos(lng)*radiusRatio;
    double sl=Math::sin(lng)*radiusRatio;

    glTexCoord2f(texX,texY1);
    glNormal3d(c1*cl,c1*sl,s1);
    glVertex3d(xy1*cl,xy1*sl,z1);

    glTexCoord2f(texX,texY0);
    glNormal3d(c0*cl,c0*sl,s0);
    glVertex3d(xy0*cl,xy0*sl,z0);
    }
    glEnd();
    }
    glEndList();
}

如果我的代碼難以閱讀,我道歉。 如果你看到我的代碼出了什么問題,請告訴我。 我試着閱讀這個錯誤,但它仍然顯示出來。 有什么想法嗎?

正如glBindTexture的文檔所述,“你必須使用glGenTextures來生成一組新的紋理名稱。”。 這意味着您必須先使用有效的紋理名稱填充“surface”變量。 這可能是您的GL錯誤來自的地方。 其次,在通過調用“glBindTexture(GL_TEXTURE_2D,0)”使用它之前再次取消綁定紋理。 第三,要找出導致GL錯誤的原因,最好創建一個調用glGetError的宏,並在出現錯誤時打印一條日志消息。 您可以在調用GL之間傳播該宏以縮小發生錯誤的位置。

這段代碼中的問題是這一行glEndList(); 一旦我刪除它,程序工作沒有任何錯誤。

暫無
暫無

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

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