我在片段着色器中进行光线投射.为了这个目的,我可以想出几种方法来绘制全屏四边形.在投影矩阵设置为单位矩阵的情况下在剪辑空间中绘制四边形,或使用几何着色器将点转换为三角形条带.前者使用立即模式,在OpenGL 3.2中弃用.后者我使用了新颖性,但它仍然使用立即模式来说明一点.
我的问题是在GLSL着色器中可以访问多个纹理.这是我正在做的事情:
着色器:
uniform sampler2D sampler0;
uniform sampler2D sampler1;
uniform float blend;
void main( void )
{
vec2 coords = gl_TexCoord[0];
vec4 col = texture2D(sampler0, coords);
vec4 col2 = texture2D(sampler1, coords);
if (blend > 0.5){
gl_FragColor = col;
} else {
gl_FragColor = col2;
}
};
Run Code Online (Sandbox Code Playgroud)
因此,我只需根据统一变量在两个颜色值之间进行选择.足够简单(这是一个测试),但是当混合<= 0.5时,我得到全黑,而不是预期的行为.
OpenGL代码:
m_sampler0location = m_shader.FindUniform("sampler0");
m_sampler1location = m_shader.FindUniform("sampler1");
m_blendlocation = m_shader.FindUniform("blend");
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler0location, 0);
glBindTexture(GL_TEXTURE_2D, Texture0.Handle);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
m_extensions.glUniform1iARB(m_sampler1location, 1);
glBindTexture(GL_TEXTURE_2D, Texture1.Handle);
glBegin(GL_QUADS);
//lower left
glTexCoord2f(0, 0);
glVertex2f(-1.0, -1.0);
//upper left …Run Code Online (Sandbox Code Playgroud) 我只是在了解它们,并发现它们已被弃用而令人沮丧.我应该继续投资学习吗?我会学到一些对当前模型有用的东西吗?
我想在视觉上加入两个重叠的圆圈

变

我已经有了部分圆的方法,但现在我需要知道earch圆的重叠角度有多大,我不知道该怎么做.
有人有想法吗?
我想通过glReadPixels()从动画中获取每个OpenGL帧,并将数据转换为OpenCV :: Mat.我知道glReadPixels()从左到右按行从下一行到上一行获取数据.另一方面,OpenCV以不同方式存储数据.
有没有人知道任何库或任何帮助我将数据从glReadPixels转换为OpenCV的教程/示例: C++中的Mat?
摘要
OpenGL frame -----------------------> CV::Mat
Data from left to right, Data from left to right,
bottom to top. top to bottom.
Run Code Online (Sandbox Code Playgroud) 我在C++中做了一些OpenGL编程.
这是我的代码的一部分:
#include <time.h>
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h> <<< Error here "Cannot open source file gl/glut.h"
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
编辑:我正在使用Microsoft Visual C++ Express Edition.对不起忘了提它
我对VBO很困惑,
glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
Run Code Online (Sandbox Code Playgroud)
除了GL_ARRAY_BUFFER,还有其他目标类型:GL_ATOMIC_COUNTER_BUFFER,GL_COPY_READ_BUFFER ......
但是,Opengl手册没有提到这些目标的含义.我检查了glew.h:
#define GL_ARRAY_BUFFER 0x8892
Run Code Online (Sandbox Code Playgroud)
这是否意味着目标(如GL_ARRAY_BUFFER)是地址?
目标 - GL_ARRAY_BUFFER在glBindBuffer中的含义是什么?
在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.
但是当我使用这样的着色器时:
顶点着色器:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)
其中的属性aVertex和aColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.
片段着色器:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)
三角形仍然充满了渐变,这里有一个问题:
如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.
那么渐变来自哪里?
或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?
我一直假设我的伽马校正管道应该如下:
GL_SRGB8_ALPHA8)中加载的所有纹理使用sRGB格式,因为所有艺术程序都会对其文件进行预伽玛校正.从GL_SRGB8_ALPHA8着色器中的纹理采样时,OpenGL将自动转换为线性空间.请注意,在我的情况下,最终的颜色写入涉及我从FBO(线性RGB纹理)写入后缓冲区.
我的假设受到挑战,好像我在最后阶段进行了伽马校正,我的颜色比它们应该更亮.我设立了由我的价值灯光绘制纯色{255,106,0},但是当我使我得到的{255,171,0}(由打印筛选和颜色采摘确定).而不是橙色我变黄了.如果我没有在最后一步Gamma校正我得到完全相同的{255,权值106,0}.
根据一些资源,现代液晶屏幕模仿CRT伽玛.他们总是吗?如果没有,我怎么知道我是否应该伽马正确?我在其他地方出错了吗?
我现在已经注意到,即使我用光写的颜色是正确的,我使用纹理颜色的地方也不正确(但是如果没有伽马校正,我的预期会更暗).我不知道这种差异来自何处.
在尝试GL_RGBA8我的纹理而不是之后GL_SRGB8_ALPHA8,即使在光照计算中使用纹理值(如果我将光的强度减半,输出颜色值减半),一切看起来都很完美.
我的代码不再考虑任何地方的伽玛校正,我的输出看起来正确.
这让我更加困惑,不再需要/使用伽玛校正?
经过一些实验后,我对这里的几点感到困惑.
1 - 大多数图像格式都是非线性存储的(在sRGB空间中)
我加载了一些图像(在我的例子中是.png和.bmp图像)并检查了原始二进制数据.在我看来,好像图像实际上是在RGB颜色空间中,就好像我将像素值与图像编辑程序与我在程序中得到的字节数组进行比较,它们完美匹配.由于我的图像编辑器给了我RGB值,这表示存储在RGB中的图像.
我正在使用stb_image.h/.c来加载我的图像并一直加载.png并且没有看到加载时伽玛校正图像的任何地方.我还在十六进制编辑器中检查了.bmps,并且磁盘上的值与它们匹配.
如果这些图像实际存储在线性RGB空间的磁盘上,我应该如何(以编程方式)知道何时指定图像是在sRGB空间中?是否有某种方法可以查询更具特色的图像加载器可能提供的内容?或者由图像创建者来保存他们的图像作为伽马校正(或不校正) - 意味着建立一个约定并遵循它给定一个项目.我问了几位艺术家,他们都不知道伽马校正是什么.
如果我指定我的图像是sRGB,它们太暗了,除非我最后进行伽马校正(如果监视器使用sRGB输出,这是可以理解的,但请参见第2点).
2 - "在大多数计算机上,有效扫描输出LUT是线性的!这意味着什么?"
我不确定我能在你的回复中找到这个想法的结果.
据我所知,经过实验,我测试了所有显示器的输出线性值.如果我绘制全屏四边形并在着色器中使用硬编码值对其进行着色而不进行伽马校正,则显示器会显示我指定的正确值.
我从你的回答和我的结果中引用的句子会让我相信现代监视器输出线性值(即不模仿CRT伽玛).
我们的应用程序的目标平台是PC.对于这个平台(不包括带有CRT或真正旧显示器的人),对#1做出任何响应都是合理的,然后对#2进行非伽马校正(即不执行最终的RGB-> sRGB转换 - 手动或使用GL_FRAMEBUFFER_SRGB)?
如果是这样的话,那GL_FRAMEBUFFER_SRGB的平台是什么(或者今天有效使用它的平台),或者是使用线性RGB的监视器真的那么新(假设GL_FRAMEBUFFER_SRGB是2008年推出的那样)?
-
我和我学校的其他一些图形开发人员谈过,并且从它的声音来看,他们都没有考虑伽马校正,他们没有注意到任何不正确的事情(有些人甚至都没有意识到).一个开发人员特别说他在考虑伽玛时得到了不正确的结果,因此他决定不担心伽玛.鉴于我在线/看到我的项目时出现的信息存在冲突,我不确定在我的目标平台项目中该怎么做.
确实是的.如果在信号链中的某处应用了非线性变换,但是所有像素值都未从图像中修改为显示,则该非线性已经预先应用于图像的像素值.这意味着,图像已经处于非线性色彩空间中.
如果我正在检查显示器上的图像,您的回答对我来说是有意义的.可以肯定我是清楚的,当我说我正在研究该图像的字节数组,我的意思是我正在研究在内存中数值的纹理,而不是屏幕上的图像输出(我没有为点#做2) .对我来说,唯一可以看到你说的是真实的方式就是图像编辑器给我的sRGB空间值.
另请注意,我确实尝试检查显示器上的输出,以及修改纹理颜色(例如,除以一半或加倍),输出显示正确(使用我在下面描述的方法测量).
你是如何测量信号响应的? …
我使用freeglut,GLEW 和魔鬼,以呈现纹理的茶壶使用顶点和片段着色器.这在Ubuntu 14.04上的OpenGL 2.0和GLSL 1.2中都运行良好.
现在,我想将凹凸贴图应用于茶壶.我的讲师显然不会酿造他自己的茶,所以不知道他们应该是顺利的.无论如何,我找到了一个关于老式凹凸贴图的漂亮教程,其中包括一个片段着色器,它开始于:
uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map
Run Code Online (Sandbox Code Playgroud)
他们没有提到的是如何将两个纹理首先传递给着色器.
以前我
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);
Run Code Online (Sandbox Code Playgroud)
所以现在我
//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);
//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I …Run Code Online (Sandbox Code Playgroud)