opengl变量

1.uniform变量
uniform变量是外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过

函数glUniform**()函数赋值的。在(vertex和fragment)shader程序内部,uniform变量就像是C语言里面

的常量(const ),它不能被shader程序修改。(shader只能用,不能改)

如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。

(相当于一个被vertex和fragment shader共享的全局变量)

uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。

以下是例子:

uniform mat4 viewProjMatrix; //投影+视图矩阵
uniform mat4 viewMatrix;        //视图矩阵
uniform vec3 lightPosition;     //光源位置

 

2.attribute变量
attribute变量是只能在vertex shader中使用的变量。(它不能在fragment shader中声明attribute变量,

也不能被fragment shader中使用)

一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数

glVertexAttribPointer()为每个attribute变量赋值。

以下是例子:

uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord;
void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}

3.varying变量
varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,

然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声

明必须是一致的。application不能使用此变量。

以下是例子:

// Vertex shader
uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord; // Varying in vertex shader
void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}


// Fragment shader
precision mediump float;
varying vec2 v_texCoord; // Varying in fragment shader
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main()
{
vec4 baseColor;
vec4 lightColor;
baseColor = texture2D(s_baseMap, v_texCoord);
lightColor = texture2D(s_lightMap, v_texCoord);
gl_FragColor = baseColor * (lightColor + 0.25);
}

3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个技术问题,我可以回答。在OpenGL中,你可以使用键盘事件来改变程序中的变量值。你可以通过注册键盘回调函数来检测键盘事件,然后在回调函数中修改变量值。具体的实现方法可以参考OpenGL的相关文档或者示例代码。 ### 回答2: OpenGL本身并不直接提供给程序变量赋值的功能,因为OpenGL是一个图形渲染库,主要用于绘制图形和处理图形相关的操作,不涉及程序中的变量赋值。 然而,我们可以通过与OpenGL的集成来实现键盘给程序中的变量赋值的功能。一种常见的方法是使用操作系统提供的键盘事件处理机制。 首先,我们需要监听键盘事件,可以使用操作系统的键盘事件监听机制或第三方库。当键盘按键按下或释放时,会生成相应的键盘事件。 接下来,我们在键盘事件处理函数中编写逻辑来根据按键的具体情况给程序中的变量赋值。 例如,当按下W键时,可以将相应的程序变量设置为1,表示向前移动;当按下S键时,可以将相应的程序变量设置为-1,表示向后移动;当释放W或S键时,可以将相应的程序变量设置为0,表示停止移动。 注意,具体的实现方式可能取决于所使用的编程语言和操作系统。例如,在C++中可以使用OpenGL和GLUT库来实现键盘事件的监听和处理。 总之,通过与OpenGL的集成以及键盘事件的监听和处理机制,我们可以实现键盘给程序中的变量赋值的功能。 ### 回答3: 在OpenGL中,可以通过键盘给程序中的变量赋值。实现这个功能的关键是通过钩子函数(Hook Function)来捕捉键盘事件,并将键盘输入映射到特定的变量上。 首先,我们需要注册一个回调函数来处理键盘事件。在OpenGL中,可以使用GLUT库(OpenGL Utility Toolkit)提供的glutKeyboardFunc函数来注册一个键盘回调函数。这个回调函数的原型如下: ``` void keyboardCallback(unsigned char key, int x, int y) { // 处理键盘事件的逻辑代码 } ``` 在回调函数中,我们可以根据键盘按下的键码(key)来判断用户输入,并根据需要修改程序中的变量。例如,如果我们想通过按下'A'键来将变量x的值增加1,可以添加如下语句: ``` void keyboardCallback(unsigned char key, int x, int y) { if (key == 'A' || key == 'a') { x += 1; } } ``` 需要注意的是,由于回调函数中的变量是局部变量,所以无法直接修改程序中的全局变量。为了解决这个问题,我们可以使用全局指针来传递需要修改的变量的地址,并通过指针来修改变量的值,如下所示: ``` int x = 0; // 需要修改的变量 void keyboardCallback(unsigned char key, int x, int y) { int *p = &x; if (key == 'A' || key == 'a') { (*p) += 1; } } ``` 使用以上方法,我们就可以通过键盘给程序中的变量赋值了。需要注意的是,为了能够接收键盘事件,我们还需要在程序的主循环中调用glutMainLoop函数,以启动事件处理机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值