C++ 使用OpenGL的图形工件?

C++ 使用OpenGL的图形工件?,c++,c,opengl,graphics,C++,C,Opengl,Graphics,我不确定它是否被称为图形工件,但请看: 您会注意到黑色轮廓上有6个像素不合适 我的应用程序允许放大,渲染时执行以下操作: 呈现: // Set an orthogonal projection matrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(GetCameraX() - ((float)controls.MainGlFrame.Dimensions.x) * scene[current.curr

我不确定它是否被称为图形工件,但请看:

您会注意到黑色轮廓上有6个像素不合适

我的应用程序允许放大,渲染时执行以下操作:

呈现:

// 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系统并翻译所有的几何体,但我认为这样做更合适。这些人工制品是随机的,很少发生,但我仍然想摆脱它们

谢谢

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 cLengine::RenderShapes()
{
//设置正交投影矩阵
glMatrixMode(GL_投影);
glLoadIdentity();
glOrtho(GetCameraX()-((浮点)控件.MainGlFrame.Dimensions.x)*场景[current.currentScene].camera.ScaleFactor
/2,GetCameraX()+((float)controls.MainGlFrame.Dimensions.x)*场景[current.currentScene].camera.ScaleFactor/2,
GetCameraY()-((float)controls.MainGlFrame.Dimensions.y)*场景[current.currentScene].camera.ScaleFactor/2,
GetCameraY()+((浮点)控件.MainGlFrame.Dimensions.y)*场景[current.currentScene].camera.ScaleFactor/2,
-1.0f,1.0f);
//将模型矩阵设置为当前矩阵
glMatrixMode(GLU模型视图);
glLoadIdentity();
hdc=BeginPaint(controls.MainGlContext.mhWnd和ps);
//启动OGL代码
glClear(GLU颜色缓冲位);
对于(unsigned int currentlayer=0;currentlayer1)
{
gl3f(0,0,0);
glBindBufferARB(GL_数组_BUFFER_ARB,controls.MainGlFrame.BufferVBO);
glBufferDataARB(GL_数组\u BUFFER_ARB,sizeof(GLdouble)*场景[current.currentScene]。图层[TempBuffers[i]。图层]。形状[TempBuffers[i]。形状]。轮廓[0]。绘图点。大小()*2
,(GLdouble*)(&scene[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].Contour[0].DrawingPoints[0]),GL_STATIC_COPY);
glEnableClientState(GL_顶点_数组);
glBindBufferARB(GL_数组_BUFFER_ARB,controls.MainGlFrame.BufferVBO);
glVertexPointer(2,GL_DOUBLE,0,(char*)NULL);//将顶点指针设置为顶点缓冲区
如果(场景[current.currentScene].layer[TempBuffers[i].layer].Shapes[TempBuffers[i].shape].connected)
{
glDrawArrays(GL_LINE_LOOP,0,场景[current.currentScene]。层[TempBuffers[i]。层]。形状[TempBuffers[i]。形状]。轮廓[0]。DrawingPoints.size();
}
其他的
{
glDrawArrays(GL_LINE_STRIP,0,场景[current.currentScene]。层[TempBuffers[i]。层]。形状[TempBuffers[i]。形状]。轮廓[0]。DrawingPoints.size();
}
GL3F(1,0.5,0.5);
//glDrawArrays(GL_点,0,层[TempBuffers[i]。层].Shapes[TempBuffers[i]。shape]。等高线[0]。DrawingPoints.size());
glDisableClientState(GL_顶点_数组);
glBindBufferARB(GL_数组_BUFFER_ARB,0);
}
}
/*
gl3f(0,0,0);
线宽(2);
*/
/*
if(ObjectBuffer.Contour[0].UserPoints.size()>0)
{
glBegin(GL_行);
对于(无符号整数i=0;i
调整大小:

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 CGlFrame::resize(HWND主窗口,CGlContext*上下文,浮点右余数)
{
直肠系膜;
GetClientRect(主窗口和clientRect);
如果(!hasstarted)
{
context->killOGL();
上下文->初始化(framehWnd,
上下文->格式);
hasstarted=true;
//生成VBO
glGenBuffersARB(1,&BufferVBO);
}
SetWindowPos(框架宽度、空值、工具宽度、选项卡高度、,
(静态_铸造(((clientRect.right-clientRect.left)-刀具宽度-右余数))+刀具宽度,
(静态_转换((clientRect.bottom-clientRect.top)-tabHeight-paramHeight),NULL);
整数宽度;
内部高度;
纽温;
GetClientRect(framehWnd和newwin);
宽度=newwin.right-newwin.left;
高度=newwin.bottom-newwin.top;
尺寸x=宽度;
尺寸y=高度;
glViewport(0,0,宽度,高度);
glShadeModel(GL_平滑);
glHint(GL\u透视图\u校正\u提示,GL\u最佳);
glEnable(GL_多边形_光滑);
glEnable(GL_线_光滑);
glEnable(GL_CULL_面);
正面(背面);
//glPolygonMode(GLU前、后、GLU线);
glEnable(GL_MULTISAMPLE_ARB);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
glClearColor(1.0f、1.0f、1.0f、0.0f);
线宽(2);
gl点大小(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);


}
void CGlShape::Render()
{
如果(!render)
{
返回;
}
glColor4f(MainShapeColor.r、MainShapeColor.g、MainShapeColor.b、MainShapeColor.a);
如果(渐变。激活)
{
glEnable(GL_纹理_2D);
glBindTexture(GL_TEXTURE_2D,Gradient.TextureId);
}
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_纹理_坐标_阵列);
glBindBufferARB(GL_数组_BUFFER_ARB,ObjectVBOInt);
glVertexPointer(2,GL_FLOAT,0,(char*)NULL);//将顶点指针设置为顶点缓冲区
glBindBufferARB(GL_数组_BUFFER_ARB,textureCordsvboint);
glTexCoordPointer(2,GL_FLOAT,0,(char*)NULL);//将顶点指针设置为顶点缓冲区
glDrawArray(GL_三角形,0,ObjectVBOCount);
glDisableClientState(GL_纹理_坐标_数组);
glBindBuffe