该vec3类型是一个非常好的类型.它只需要3个浮点数,我的数据只需要3个浮点数.我想在UBO和/或SSBO的结构中使用一个:
layout(std140) uniform UBO
{
vec4 data1;
vec3 data2;
float data3;
};
layout(std430) buffer SSBO
{
vec4 data1;
vec3 data2;
float data3;
};
Run Code Online (Sandbox Code Playgroud)
然后,在我的C或C++代码中,我可以这样做来创建匹配的数据结构:
struct UBO
{
vector4 data1;
vector3 data2;
float data3;
};
struct SSBO
{
vector4 data1;
vector3 data2;
float data3;
};
Run Code Online (Sandbox Code Playgroud)
这是一个好主意吗?
我试图使用OpenGL着色语言(GLSL)1.5版来制作顶点和几何着色器.
我已经了解到在GLSL 1.5版中,gl_ModelViewProjectionMatrix不推荐使用内置变量,所以你必须手动传递它们.如果我已经设置了模型视图和投影矩阵(使用gluLookAt和gluPerspective例如),那么如何让矩阵传递到顶点和几何着色器?我做了一些搜索,一些网站似乎提到了一个函数glGetMatrix(),但我在任何官方文档中找不到该函数,并且它似乎不存在于我正在使用的实现中(unknown identifier: glGetMatrix当我得到编译错误时)尝试用该函数编译它).
我已经阅读了一个纹理示例OpenGL 2.1.片段着色器看起来像这样:
#version 120
uniform sampler2D texture;
varying vec2 texcoord;
void main(void)
{
gl_FragColor = texture2D(texture, texcoord);
}
Run Code Online (Sandbox Code Playgroud)
在texcoord从顶点着色器传递.
使用以下C++呈现代码:
void render()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glUniform1i(unf_texture, 0);
}
Run Code Online (Sandbox Code Playgroud)
我对某些事感到困惑.我有一些问题:
在片段着色器中,纹理传递零值(通过glUniform1i).价值真的是零吗?价值还有别的吗?
被glUniform1i()调用真正需要的?
为什么我们在glUniform1i中传递零值?
点精灵是构建粒子系统的最佳选择吗?
新版本的OpenGL和最新图形卡的驱动程序中是否存在点精灵?或者我应该使用vbo和glsl吗?
在我的片段着色器中,我可以加载纹理,然后执行以下操作:
uniform sampler2D tex;
void main(void) {
vec4 color = texture2D(tex, gl_TexCoord[0].st);
gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)
这将当前像素设置为纹理的颜色值.我可以修改这些等,它运作良好.
但是有几个问题.我如何判断"我"是哪个像素?例如,假设我想将像素100,100(x,y)设置为红色.其他一切都变黑了.我该怎么做:
"if currentSelf.Position()==(100,100); then color = red; else color = black?"
?
我知道如何设置颜色,但我如何获得"我的"位置?
其次,如何从邻居像素获取值?
我试过这个:
vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);
Run Code Online (Sandbox Code Playgroud)
但不清楚它的回归是什么?如果我像素100,100; 如何从101,100或100,101获取值?
我需要从RGB颜色空间传递到HSV ..我在互联网上搜索并发现了两种不同的实现,但这些给了我不同的结果:
A:
precision mediump float;
vec3 rgb2hsv(float r, float g, float b) {
float h = 0.0;
float s = 0.0;
float v = 0.0;
float min = min( min(r, g), b );
float max = max( max(r, g), b );
v = max; // v
float delta = max - min;
if( max != 0.0 )
s = delta / max; // s
else {
// r = g = b = 0 // s = 0, v …Run Code Online (Sandbox Code Playgroud) 在GLSL文档中,该术语genType通常用作参数类型.例如,该函数dot记录如下:
float dot(genType x,
genType y);
double dot(genDType x,
genDType y);
Run Code Online (Sandbox Code Playgroud)
这个词genType是什么意思?它的缩写是什么?它是否用于OpenGL之外的其他地方?
我想根据它们在世界上的xyz位置来调整颜色.
我在片段着色器中试过这个:
varying vec4 verpos;
void main(){
vec4 c;
c.x = verpos.x;
c.y = verpos.y;
c.z = verpos.z;
c.w = 1.0;
gl_FragColor = c;
}
Run Code Online (Sandbox Code Playgroud)
但似乎颜色根据我的相机角度/位置而变化,我如何使坐标独立于我的相机位置/角度?
继承人我的顶点着色器:
varying vec4 verpos;
void main(){
gl_Position = ftransform();
verpos = gl_ModelViewMatrix*gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
Edit2:改变标题,所以我想要世界坐标,而不是屏幕坐标!
Edit3:添加了我的完整代码
对于版本#330,默认的顶点,片段和几何GLSL着色器是什么样的?
我将#version 330通过Cg编译器使用GLSL版本3.30 NVIDIA,因为这是我的显卡支持的.
使用默认着色器时,我的意思是着色器与图形卡在关闭着色器程序时执行的操作完全相同.
我找不到一个很好的例子#version 330.一整天都在谷歌搜索.不确定术语默认着色器是否被称为其他类似于普通或基本的东西,如果这就是为什么我找不到它.
对于版本330的书籍的任何建议或链接到330版本的简单初学者教程也会很棒.
#version 110中的普通顶点着色器的示例执行默认的顶点变换
#version 110
void main()
{
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
#version 110中的普通片段着色器的示例将颜色变为红色
#version 110
void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud) glLineStipple已在最新的OpenGL API中弃用.什么被取代?如果没有更换,我怎么能得到类似的效果?(我当然不想使用兼容性配置文件...)