我成功地在 openGL 中使用 VBO 和 IBO 生成了高度图。该数据的全貌如下图所示。我真正想要显示的只是非黑色的数据。当颜色为黑色时,我将 z 值设为零。
这是我生成索引的代码
void triangle::getIndices(QVector<double> minmaxX_, QVector<double> minmaxY_)
{
indices.clear();
int numY = round((minmaxY_[1] - minmaxY_[0]) / minmaxY_[2]) + 1;
int numX = round((minmaxX_[1] - minmaxX_[0]) / minmaxX_[2]) + 1;
for (int row=0; row<numY-1; row++) {
if ((row&1) == 0 ) { // even rows
for ( int col=0; col<numX; col++ ) {
indices.append(col + row*numX);
indices.append(col + (row + 1)*numX);
}
}
else {
for ( int col=numX-1; col>=0; col-- ) {
indices.append(col + (row*numX));
indices.append(col + ((row + 1)*numX));
}
}
}
}
我的着色器代码
const char* const frgshdr_source =
"uniform const float colorSize;\n"
"uniform vec3 colorTable[512];"
"varying float height;\n"
"uniform float heightSize;\n"
"uniform float heightMin;\n"
"void main() {\n"
" //vec3 colorTable2[int(colorSize)+1] = colorTable;\n"
" float h = (height - heightMin)/heightSize;\n"
" if (h < 0.0f || h > 1.0f) {\n"
" gl_FragColor = vec4(0.0f, 0.0f, 0.0f, 0.0f);}\n"
" else {"
" int i = 0;\n"
" while (h >= float(i + 1)/colorSize) {\n"
" i += 1;}\n"
" vec3 base = mix(colorTable[i], colorTable[i+1], colorSize*(h - (float(i)/colorSize)));\n"
" gl_FragColor = vec4(base, 1.0f);}\n"
"}\n";
不幸的是,在我使用投影矩阵(正交)裁剪 z 值之后。我仍然在边缘得到一些伪影,如下图所示。
这是我的正交投影矩阵
m_projection.ortho( minX, maxX, minY, maxY, minZ, maxZ);
看起来就像openGL自动重新创建了一些三角形,所以它会在边缘(紫色线)周围制作人工制品。
有什么方法可以让这个边缘伪影消失,或者我需要再次定义我的索引?
预先感谢您的帮助。