如何通过着色器管道传递顶点颜色?

2024-04-16

我试图通过顶点、几何和片段着色器传递顶点颜色:

glBegin(GL_POINTS);
    glVertex3f(-2.0f, 0.0f, 0.0); glColor3f(0.0,1.0,0.0);
    glVertex3f(+2.0f, 0.0f, 0.0); glColor3f(0.0,0.0,1.0);
glEnd();

顶点着色器:

# version 130 
varying vec4 colorv;
void main() {
    // pass trough:
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; 
    colorv = gl_Color; 
}

几何着色器:

#version 150

layout(points) in; // origo of cell
layout(points, max_vertices = 1) out;

varying vec4 colorv; 
varying vec4 color;
void main (void) 
{   
    for(int i = 0; i < gl_in.length(); ++i)
    {
        color = colorv;
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
        EndPrimitive();    
    }
}

片段着色器:

# version 130 
varying vec4 color;
void main (void) 
{   
    // pass-trough:    
    gl_FragColor = color;
}

然而它不起作用:-(。两个点都变成灰色。 我该怎么做呢?


尝试更改几何着色器中的输入/输出声明:

varying vec4 colorv; 
varying vec4 color;

to this:

in vec4 colorv[];
out vec4 color;

Like so:

#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
#include <vector>

using namespace std;

#define GLSL( version, shader )  "#version " #version "\n" #shader

const GLchar* vert = GLSL
( 
    130,
    varying vec4 colorv;
    void main() {
        // pass trough:
        gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; 
        colorv = gl_Color; 
    }
);

const GLchar* geom = GLSL
( 
    150,
    layout(points) in; // origo of cell
    layout(points, max_vertices = 1) out;

    in vec4 colorv[];
    out vec4 color;
    void main (void) 
    {   
        for( int i = 0; i < gl_in.length(); ++i )
        {
            color = colorv[i];
            gl_Position = gl_in[i].gl_Position;
            EmitVertex();
        }
        EndPrimitive();    
    }
);

const GLchar* frag = GLSL
(
    130,
    varying vec4 color;
    void main (void) 
    {   
        // pass-trough:    
        gl_FragColor = color;
    }
);

GLuint LoadShader( GLenum type, const string& aShaderSrc )
{
    GLuint shader = glCreateShader( type );
    const char* srcPtr = aShaderSrc.c_str();
    glShaderSource( shader, 1, &srcPtr, NULL );
    glCompileShader( shader );
    return shader;
}

GLuint LoadProgram( const string& aVertSrc, const string& aGeomSrc, const string& aFragSrc )
{
    GLuint vert = LoadShader( GL_VERTEX_SHADER, aVertSrc );
    GLuint geom = LoadShader( GL_GEOMETRY_SHADER, aGeomSrc );
    GLuint frag = LoadShader( GL_FRAGMENT_SHADER, aFragSrc );
    GLuint program = glCreateProgram();
    glAttachShader( program, vert );
    glAttachShader( program, geom );
    glAttachShader( program, frag );
    glLinkProgram( program );
    return program;
}

GLuint prog = 0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    double ar = w / h;
    glOrtho( -2 * ar, 2 * ar, -2, 2, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glUseProgram( prog );

    glBegin(GL_POINTS);
    glColor3ub( 0, 255, 0 );
    glVertex3f(-1.0f, 0.0f, 0.0);
    glColor3ub( 0, 0, 255 );
    glVertex3f(+1.0f, 0.0f, 0.0);
    glEnd();

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "Geometry Shaders" );
    glewInit();

    prog = LoadProgram( vert, geom, frag );

    glutDisplayFunc( display );
    glutMainLoop();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过着色器管道传递顶点颜色? 的相关文章

  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • Qt 5 和 OS X Mavericks 问题

    我正在使用 Cmake 在 OS X 10 9 上构建 QT 项目 自 Mavericks 以来 OpenGL 标头的位置似乎发生了变化 文件夹 System Library Frameworks OpenGL framework Head
  • 将 CVPixelBuffer 渲染到 NSView (macOS)

    我有一个CVPixelBuffer我正在尝试在屏幕上有效地绘制 转变为低效率的方式NSImage可以工作 但速度非常慢 丢掉了大约 40 的帧数 因此 我尝试使用将其渲染在屏幕上CIContext s drawImage inRect fr
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • 使用 Opengl 绘制立方体 3D

    我想使用 OpenGL 绘制 3D 立方体这是我的代码如何纠正错误 float ver 8 3 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • GLSL - 计算表面法线

    我有一个用 GLSL 编写的简单顶点着色器 我想知道是否有人可以帮助我计算表面的法线 我正在 升级 一个平面 所以当前的灯光模型看起来 很奇怪 这是我当前的代码 varying vec4 oColor varying vec3 oEyeNo
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • 我的绘图存在坐标/glortho 问题

    I have made a bit of a change to my code in the last couple of hours as everything was messy with my grid so I made it i
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 如何安装适用于 Windows C++ 的最新版本 OpenGL?

    我正在使用 Visual Studio 2010 运行 Windows 7 包含的 OpenGL 版本 include 是版本 1 1 我希望使用合理的当前版本 某种版本 3 或 4 我需要做什么才能达到该状态 OpenGL SDK 页面位
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0

随机推荐