调用gluNewQuadric出现"invalid value"错误的技术求助
解决GLU Disk "invalid value" 错误的方案
嗨,我看了你的代码,问题其实和你猜测的gluNewQuadric指针范围问题没关系,核心出在gluDisk的参数设置上~
错误原因
GLU的gluDisk函数对最后两个参数有明确的有效性要求:
slices:围绕Z轴的圆周细分次数,必须是大于等于3的正整数——毕竟至少要3个分段才能形成封闭的圆周loops:同心环的数量,虽然允许最小值为1,但当内半径为0时,结合slices=1的设置,完全无法生成有效的圆盘几何,GLU会直接判定参数无效并抛出"invalid value"错误
你代码里的调用是:
gluDisk(quadrica, 0.0, 5.0, 1, 1);
这里slices=1是触发错误的关键——一个分段根本构不成圆盘的圆周,GLU会直接拒绝这种参数。
修复后的代码
把slices和loops改成合理的数值即可,比如slices=20(足够平滑的圆周)、loops=5(多层同心环),至少保证slices>=3:
#include <stdio.h> #include <stdlib.h> #include <GL/glut.h> #ifndef CALLBACK #define CALLBACK #endif void CALLBACK erro(GLenum coderro) { const GLubyte *estring; estring=gluErrorString(coderro); fprintf(stderr, "Erro de quadrica: %s\n", estring); exit(0); } void tela () { GLUquadric *quadrica; glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-30.0, 30.0, -30.0, 30.0, 1, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(0.0, 0.0, -20.0); glColor3f(1.0, 0.0, 0.0); quadrica=gluNewQuadric(); gluQuadricCallback(quadrica, GLU_ERROR, erro); gluQuadricDrawStyle(quadrica, GLU_FILL); // 修改为符合要求的参数值 gluDisk(quadrica, 0.0, 5.0, 20, 5); glFlush(); } int main (int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize(500, 500); glutCreateWindow("Tesselacao"); glutDisplayFunc(tela); glutMainLoop(); }
额外提示
- 你可以根据需求调整
slices和loops的数值:数值越大圆盘越平滑,但会略微降低渲染性能 - 如果需要实心圆盘(内半径为0),
loops=1是允许的,但一定要保证slices>=3 - 后续遇到GLU相关错误时,优先对照函数的参数规范检查,大部分这类错误都是参数不符合要求导致的
内容的提问来源于stack exchange,提问作者Cícero Augusto
相关产品推荐
相关产品推荐

