Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何使用着色器更改点的颜色_Opengl_Colors_Shader_Glut - Fatal编程技术网

Opengl 如何使用着色器更改点的颜色

Opengl 如何使用着色器更改点的颜色,opengl,colors,shader,glut,Opengl,Colors,Shader,Glut,我有一个应用程序,我在一个过剩窗口上画了一堆点。我有一个顶点着色器和一个frag着色器,我给了它们一个颜色输入。我的顶点着色器看起来像: #version 120 attribute vec2 position; varying vec4 vColor; void main() { vColor = gl_Color; gl_Position = vec4( position, 0.0, 1.0 ); } #version 120 varying vec4 vColor; v

我有一个应用程序,我在一个过剩窗口上画了一堆点。我有一个顶点着色器和一个frag着色器,我给了它们一个颜色输入。我的顶点着色器看起来像:

#version 120
attribute vec2 position;

varying vec4 vColor;

void main()
{
   vColor = gl_Color;
   gl_Position = vec4( position, 0.0, 1.0 );
}
#version 120

varying vec4 vColor;
void main()
{
    gl_FragColor = vColor;
}
我的frag着色器看起来像:

#version 120
attribute vec2 position;

varying vec4 vColor;

void main()
{
   vColor = gl_Color;
   gl_Position = vec4( position, 0.0, 1.0 );
}
#version 120

varying vec4 vColor;
void main()
{
    gl_FragColor = vColor;
}
我希望用户能够根据按键更改点的颜色。因此,我有一些按键处理功能:

void handleKeyPress(unsigned char key, int x, int y)
{
    if (key == 'c')
       //todo: change the point colors to green
}

如何执行“todo”?

使用这些着色器,您只需在绘制之前发出
glColor()

glColor3f( r, g, b );
// draw geometry
但是,如果您已经将通用顶点属性用于位置,则固定函数互操作预定义变量(
gl_Color
)有点毫无意义

在这种情况下,您可以使用:

#包括
#包括
#包括
#包括
使用名称空间std;
//顶点属性包装器
结构属性
{
阿特里布
( 
常量字符*名称,常量闪烁大小,常量GLsizei步幅,常量GLvoid*指针,
常量GLenum type=GL_FLOAT,常量GLboolean normalized=GL_FALSE,常量GLuint prog=GetProgram()
)
{
mLoc=glGetAttribLocation(程序,名称);
如果(mLoc<0)返回;
GLVertexAttributePointer(mLoc、大小、类型、规格化、步幅、指针);
GlenableVertexAttributeArray(mLoc);
}
~Attrib()
{
如果(mLoc<0)返回;
GLDisableVertexAttributeArray(mLoc);
}
闪烁mLoc;
私人:
静态GLuint GetProgram()
{
闪烁程序=0;
GLGEINTEGERV(德国劳埃德船级社当前课程和课程);
返回程序;
}
};
//GLSL着色器程序加载器
结构程序
{
静态粘合负载(常量字符*垂直,常量字符*几何,常量字符*框架)
{
GLuint prog=glCreateProgram();
if(vert)附加着色器(prog,GL_VERTEX_着色器,vert);
if(geom)AttachShader(prog,GL_GEOMETRY_SHADER,geom);
if(frag)附加着色器(prog,GL_FRAGMENT_着色器,frag);
GLLINK计划(prog);
检查状态(prog);
返回程序;
}
私人:
静态无效检查状态(GLuint obj)
{
闪烁状态=GLU FALSE,len=10;
if(glishader(obj))glGetShaderiv(obj、GL\u编译状态和状态);
if(glIsProgram(obj))glGetProgramiv(obj、GL链接状态和状态);
if(status==GL_TRUE)返回;
if(glishader(obj))glGetShaderiv(obj,GL\u INFO\u LOG\u LENGTH,&len);
if(glIsProgram(obj))glGetProgramiv(obj、GL\u INFO\u LOG\u LENGTH和len);
标准::向量log(len,'X');
if(glishader(obj))glGetShaderInfoLog(obj、len、NULL和log[0]);
if(glIsProgram(obj))glGetProgramInfoLog(obj,len,NULL,&log[0]);

std::cerr有一个名为的OpenGL函数,允许您为整个绘制调用将顶点属性设置为固定值,而不是从顶点缓冲区对象中获取逐顶点值。使用此函数比使用颜色指定统一变量的优点是,您可以使用单个逐顶点颜色渲染两个几何体没有相同顶点/片段着色器对的此类属性的几何体。

这对于OpenGL来说是一个非常有用的属性。除了DX之外,对于OpenGL dat的Niiice来说,不能做同样的事情。:OThanks!我有一个额外的懒惰的属性在某处,它消除了
prog
参数(通过查询OpenGL的当前程序ID)以及默认辩论一些不太常用的东西。我会试着把它挖出来并编辑进去。如果只是为了我的话,不要那么麻烦。我这些天实际上在DirectX工作(并且被延迟渲染踢了屁股)。不过,我很快就会将所有内容移植到OpenGL,所以当这种情况发生时,我一定会完全滑向这个答案,并在我需要处理属性时抓住它。:P