我需要绘制一个边界线为一种颜色的多边形,并用另一种颜色填充内部。 是否有捷径可寻 ? 我目前绘制两个多边形,一个用于内部颜色,一个用于边界。 我认为必须做得更好。 谢谢你的帮助。
glColor3d(1,1。,。7); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 在glBegin(GL_TRIANGLES); glVertex3f(-0.8f,0.0f,0.0f); glVertex3f(-0.6f,0.0f,0.0f); glVertex3f(-0.7f,0.2f,0.0f); glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3d(.5,.5,.7); 在glBegin(GL_TRIANGLES); glVertex3f(-0.8f,0.0f,0.0f); glVertex3f(-0.6f,0.0f,0.0f); glVertex3f(-0.7f,0.2f,0.0f); glEnd();
谢谢大家回答我的问题。 我对openGL很新,并且正在寻找一个简单问题的简单答案。 答案似乎并非如此简单,可能需要花费一个学期的学习时间。
更现代的方法是通过几何着色器实现这一点。 这适用于OpenGL 3.2及更高版本作为核心function的一部分,或适用于扩展名为GL_EXT_geometry_shader4的OpenGL 2.1。
本文具有所有相关理论: 基于着色器的线框图 。 它还提供了GLSL中最简单技术的示例实现。
这是我自己的抨击,基本上是OpenGL 3.3的实现端口,仅限于三角形基元:
顶点着色器:(将输入替换为用于传递顶点数据m m,v和p矩阵的任何内容)
#version 330 layout(location = 0) in vec4 position; layout(location = 1) in mat4 mv; out Data { vec4 position; } vdata; uniform mat4 projection; void main() { vdata.position = projection * mv * position; }
几何着色器:
#version 330 layout(triangles) in; layout(triangle_strip, max_vertices = 3) out; in Data { vec4 position; } vdata[3]; out Data { noperspective out vec3 dist; } gdata; void main() { vec2 scale = vec2(500.0f, 500.0f); // scaling factor to make 'd' in frag shader big enough to show something vec2 p0 = scale * vdata[0].position.xy/vdata[0].position.w; vec2 p1 = scale * vdata[1].position.xy/vdata[1].position.w; vec2 p2 = scale * vdata[2].position.xy/vdata[2].position.w; vec2 v0 = p2-p1; vec2 v1 = p2-p0; vec2 v2 = p1-p0; float area = abs(v1.x*v2.y - v1.y*v2.x); gdata.dist = vec3(area/length(v0),0,0); gl_Position = vdata[0].position; EmitVertex(); gdata.dist = vec3(0,area/length(v1),0); gl_Position = vdata[1].position; EmitVertex(); gdata.dist = vec3(0,0,area/length(v2)); gl_Position = vdata[2].position; EmitVertex(); EndPrimitive(); }
顶点着色器:(用你需要的任何颜色替换颜色!)
#version 330 in Data { noperspective in vec3 dist; } gdata; out vec4 outputColor; uniform sampler2D tex; const vec4 wireframeColor = vec4(1.0f, 0.0f, 0.0f, 1.0f); const vec4 fillColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); void main() { float d = min(gdata.dist.x, min(gdata.dist.y, gdata.dist.z)); float I = exp2(-2*d*d); outputColor = mix(fillColor, wireframeColor, I); }
您可以使用glPolygonMode
在多边形,线和点之间切换填充模式。
要绘制不同颜色的多边形线,您可以执行以下操作:
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); draw_mesh( fill_color ); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(-1.f,-1.f); draw_mesh( line_color );
可能需要线偏移,因为OpenGL不保证多边形的边缘将在与线完全相同的像素中进行光栅化。 因此,如果没有明确的偏移,由于深度测试失败,您可能会因多边形而隐藏线条。
有两种方法可以做到这一点:
据我所知,没有其他可能性,从性能的角度来看,这两种可能性,特别是第一种,只要你只进行颜色填充,就非常快。
我想你应该看到这个答案: 填写和概述
首先使用glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)绘制三角形并使用所需的颜色。 然后使用glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)使用轮廓颜色再次绘制三角形。
以上就是c/c++开发分享如何用不同于边界的颜色填充多边形?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562728.html