2010-07-22 4 views
0

나는 그것의 그래픽 유물이라고하지만,이 표시되면 확실하지 않다 : 당신은 장소를 벗어난 검은 윤곽에 6 개 픽셀을 알 수 http://img835.imageshack.us/img835/9785/anomoly.pngOpenGL에서의 그래픽 인공물?

.

내 응용 프로그램에 확대 할 수 있습니다 내가 렌더링 할 때 나는이 수행

렌더링 :

// Set an orthogonal projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(GetCameraX() - ((float)controls.MainGlFrame.Dimensions.x) * scene[current.currentScene].camera.ScaleFactor 
     /2, GetCameraX() + ((float)controls.MainGlFrame.Dimensions.x) * scene[current.currentScene].camera.ScaleFactor/2, 
     GetCameraY() - ((float)controls.MainGlFrame.Dimensions.y) * scene[current.currentScene].camera.ScaleFactor/2, 
     GetCameraY() + ((float)controls.MainGlFrame.Dimensions.y) * scene[current.currentScene].camera.ScaleFactor/2, 
     -1.0f, 1.0f); 

    // Set the model matrix as the current matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 


    hdc = BeginPaint(controls.MainGlContext.mhWnd,&ps); 


    //start OGL code 

카메라 구조체는 다음과 같습니다

struct SceneCam { 
    double x; 
    double y; 
    double tempX; 
    double tempY; 
    double ScaleFactor; 

}; 

나는 이것이 문제가 될 수 있습니다 의심 내가 사용하는 것은 왼쪽 상단의 coorinate 시스템을 설정하고 모든 지오메트리를 GlTranslate하는 것이기 때문에이 방법을 사용하는 것이 더 적절하다고 생각했기 때문입니다. 유물은 무작위 적이지만 거의 발생하지 않지만 여전히 제거하고 싶습니다.

감사

Render: 
void CGlEngine::RenderShapes() 
{ 





    // Set an orthogonal projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(GetCameraX() - ((float)controls.MainGlFrame.Dimensions.x) * scene[current.currentScene].camera.ScaleFactor 
     /2, GetCameraX() + ((float)controls.MainGlFrame.Dimensions.x) * scene[current.currentScene].camera.ScaleFactor/2, 
     GetCameraY() - ((float)controls.MainGlFrame.Dimensions.y) * scene[current.currentScene].camera.ScaleFactor/2, 
     GetCameraY() + ((float)controls.MainGlFrame.Dimensions.y) * scene[current.currentScene].camera.ScaleFactor/2, 
     -1.0f, 1.0f); 

    // Set the model matrix as the current matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 


    hdc = BeginPaint(controls.MainGlContext.mhWnd,&ps); 


    //start OGL code 


    glClear(GL_COLOR_BUFFER_BIT); 






for(unsigned int currentlayer = 0; currentlayer < scene[current.currentScene].layer.size(); ++currentlayer) 
{ 

    for(unsigned int i = 0; i < scene[current.currentScene].layer[currentlayer].Shapes.size(); i++) 
    { 

     //render shape here 
     scene[current.currentScene].layer[currentlayer].Shapes[i].Render(); 



    } 

} 

for(int i = 0; i < TempBuffers.size(); ++i) 
{ 
    if(scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints.size() > 1) 
    { 


    glColor3f(0,0,0); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB,controls.MainGlFrame.BufferVBO); 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB,sizeof(GLdouble) * scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints.size() * 2 
     ,(GLdouble*)(&scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints[0]),GL_STATIC_COPY); 


     glEnableClientState(GL_VERTEX_ARRAY); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, controls.MainGlFrame.BufferVBO); 
    glVertexPointer(2, GL_DOUBLE, 0, (char *) NULL);  // Set The Vertex Pointer To The Vertex Buffer 

    if(scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].connected) 
    { 
      glDrawArrays(GL_LINE_LOOP, 0, scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints.size()); 
    } 
    else 
    { 
     glDrawArrays(GL_LINE_STRIP, 0, scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints.size()); 

    } 

    glColor3f(1,0.5,0.5); 
    //glDrawArrays(GL_POINTS, 0, layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints.size()); 

    glDisableClientState(GL_VERTEX_ARRAY); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
    } 
} 
/* 
    glColor3f(0,0,0); 
    glLineWidth(2); 
    */ 
/* 
    if (ObjectBuffer.Contour[0].UserPoints.size() > 0) 
    { 

     glBegin(GL_LINES); 
     for(unsigned int i = 0; i < ObjectBuffer.Contour[0].DrawingPoints.size() - 1; ++i) 
     { 
      glVertex2d(ObjectBuffer.Contour[0].UserPoints[i].UserPoint.x,ObjectBuffer.Contour[0].UserPoints[i].UserPoint.y); 
      glVertex2d(ObjectBuffer.Contour[0].UserPoints[i + 1].UserPoint.x,ObjectBuffer.Contour[0].UserPoints[i + 1].UserPoint.y); 
     } 
     glEnd(); 
    } 
*/ 



    //end OGL code 
    glFlush(); 
    Sleep(1); 

    SwapBuffers(hdc); 



    EndPaint(controls.MainGlContext.mhWnd,&ps); 


} 

조정 :

void CGlFrame::resize(HWND mainWindow,CGlContext *context, float rightRemainder) 
{ 
    RECT clientRect; 
    GetClientRect(mainWindow,&clientRect); 

if(!hasstarted) 
{ 
    context->killOGL(); 
    context->init(framehWnd, 
     context->format); 
    hasstarted = true; 
    //Generate a VBO 
    glGenBuffersARB(1,&BufferVBO); 

} 



SetWindowPos(framehWnd,NULL,toolWidth,tabHeight, 
      (static_cast<int>(((clientRect.right - clientRect.left) - toolWidth) - rightRemainder)) + toolWidth, 
      (static_cast<int>((clientRect.bottom - clientRect.top) - tabHeight - paramHeight)) ,NULL); 



int width; 
int height; 
RECT newwin; 
GetClientRect(framehWnd,&newwin); 
width = newwin.right - newwin.left; 
height = newwin.bottom - newwin.top; 

Dimensions.x = width; 
Dimensions.y = height; 
glViewport(0, 0, width, height); 




glShadeModel(GL_SMOOTH); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
glEnable(GL_POLYGON_SMOOTH); 
glEnable(GL_LINE_SMOOTH); 
glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

glEnable(GL_MULTISAMPLE_ARB); 
glEnable(GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
glLineWidth(2); 
glPointSize(5); 

} 

모양 렌더링 :

void CGlShape::Render() 
{ 
    if(!render) 
    { 
     return; 
    } 
glColor4f(MainShapeColor.r,MainShapeColor.g,MainShapeColor.b,MainShapeColor.a); 
if(Gradient.active) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D,Gradient.TextureId); 
} 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


glBindBufferARB(GL_ARRAY_BUFFER_ARB, ObjectVBOInt); 
glVertexPointer(2, GL_FLOAT, 0, (char *) NULL);  // Set The Vertex Pointer To The Vertex Buffer 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, TextureCoordsVBOInt); 
glTexCoordPointer(2, GL_FLOAT, 0, (char *) NULL);  // Set The Vertex Pointer To The Vertex Buffer 


glDrawArrays(GL_TRIANGLES, 0, ObjectVBOCount); 

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
glDisable(GL_TEXTURE_2D); 

for(int i = 0; i < Contour.size(); ++i) 
{ 
    glColor4f(Contour[i].Outline.OutlineColor.r, 
     Contour[i].Outline.OutlineColor.g, 
     Contour[i].Outline.OutlineColor.b, 
     Contour[i].Outline.OutlineColor.a); 

glBindBufferARB(GL_ARRAY_BUFFER_ARB, Contour[i].Outline.OutlineVBO); 
glVertexPointer(2, GL_FLOAT, 0, (char *) NULL);  // Set The Vertex Pointer To The Vertex Buffer 
glDrawArrays(GL_TRIANGLES, 0, Contour[i].Outline.OutlineSize); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
} 
glDisableClientState(GL_VERTEX_ARRAY); 


} 

편집

나는의 관리 0.00001의 gltranslation으로 윤곽선을 두 번 렌더링하면됩니다. 이 작동하지만 overdraw 원인, 나는 더 나은 솔루션을했다 좋겠어.

답변

2

2 개의 삼각형이 서로 대립하는 배치를 감안할 때 두 객체가 정확하게 서로 맞지 않도록 부동 소수점 반올림의 간단한 문제라고 생각합니다.

GL_TRIANGLES 대신에 검은 색 부분을 대신 두 개 그리면 문제를 해결할 수있는 좋은 기회가됩니다 (또한 정점 수를 줄이면 성능을 약간 향상시킬 수있는 좋은 기회가됩니다. 그것을 줄 필요가있다).