我对着色器管道如何通过每个阶段传递数据感到困惑.
我要做的是通过glVertexAttrib4fv()曲面细分控制着色器,然后使用曲面细分评估着色器传递在顶点阶段加载的颜色数据,以便可以在片段着色器中使用它.我不确定我是否犯了某种概念上的错误(很可能,因为我仍然试图通过固定功能来解决这个问题),但无论如何,只要我尝试通过镶嵌着色器,我的原始人拒绝渲染.在此之前,我的原始渲染,但它只呈现黑色.我的着色器如下:
顶点着色器:
static const GLchar* vss[] =
{
"#version 430 core \n"
" \n"
"layout (location = 0) in vec4 offset; \n"
"layout (location = 1) in vec4 color; \n"
" \n"
"out vec4 vs_color; \n"
" \n"
"void main(void) \n"
"{ \n"
" const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, -0.5, 1.0), \n"
" vec4(-0.25, -0.25, -0.5, 1.0), \n"
" vec4( 0.25, 0.25, -0.5, 1.0)); \n"
" \n"
" gl_Position = vertices[gl_VertexID] + offset; \n"
" …Run Code Online (Sandbox Code Playgroud) 我在头文件中创建了一个结构,如下所示:
typedef struct
{
GLfloat lgtR, lgtG, lgtB, lgtA;
GLfloat x, y, z;
bool islight;
GLfloat width, height, depth;
GLenum lightn;
particle prt;
int maxprt;
} emitter;
Run Code Online (Sandbox Code Playgroud)
这没有问题.
但是,在那个特定的头文件中,我想声明一个可以在所有函数中使用的全局发射器,它不是主源文件的一部分:
// header.h global declaration
emmiter currentEmit;
GLvoid glSetEmitter(emitter emitter)
{
currentEmit = emitter;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个时,我得到了很多"错误C2228:'.variable'的左边必须有class/struct/union,所以我假设它根本没有声明我的结构.
有没有办法在头文件中全局声明该结构,如果是这样,是否还有一种方法可以防止它成为其他.cpp文件的一部分?