标签: opengl

C++ - 面向对象的基类数组

可能重复:
学习C++:多态和切片
用子类对象初始化的多态基类对象的数组

我已将面向对象的类集成到我的OpenGL应用程序中.基类有一个被调用的函数Tick,应该使用表示增量时间的参数调用每个tick(显而易见).这是它的样子(没有这个问题的无关紧要的东西).

头:

class Object
{
public:
    virtual void Tick(float DeltaTime);
}
class Controller : public Object
{
public:
    virtual void Tick(float DeltaTime);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个名为的类Engine包含主循环,初始化和处理(将其与窗口创建分开).
在那个课程中我需要跟踪游戏中的所有对象,所以我创建了一个数组:
Object* Objects = new Object[10]; // for now max 10 objects

然后调用tick函数,我通过数组迭代:

for (unsigned int c = 0; c < 10; c++)
    Objects[c].Tick(delta);
Run Code Online (Sandbox Code Playgroud)

delta循环之前进行计算.

问题在于,如果我将数组中的一个对象分配给Controller(例如),则调用的Tick函数始终是在Object实际存储的类中而不在其中的那个.

我甚至尝试过类型转换(每个类都有一个字符串来识别它的类型),但没有用.

我很确定答案是显而易见的(就像我上一期的答案一样),但我找不到答案.

感谢您的时间.:)

c++ arrays opengl oop

0
推荐指数
1
解决办法
1172
查看次数

在C++中声明头文件中的全局结构

我在头文件中创建了一个结构,如下所示:

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文件的一部分?

c++ opengl structure declaration global-variables

0
推荐指数
1
解决办法
1450
查看次数

OpenGL - 使用glDrawElements的着色器

我很好奇你如何指定使用glDrawElements()渲染时使用的着色器.它是使用绑定的最后一个着色器吗?或者你必须使用其他命令.

总结一下:当我使用glDrawElements()时,如何指定使用哪个着色器,即将在我渲染的VBO中的三角形上使用的着色器.

opengl shader render

0
推荐指数
1
解决办法
831
查看次数

为什么exit(0)给我错误?

所以我一直在关注一个教程,当我尝试编译以下代码时:

#include <glut.h>
#include <iostream>

void render(void);
void keyboard(unsigned char c, int x, int y);
void mouse(int button, int state, int x, int y);

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Test GLUT App");

    glutDisplayFunc(render); // render
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);

    glutMainLoop(); // initialization finished. start rendering
}

void render(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
    glColor3f(0.5, 0.2, 0.9);
    glVertex2f(-0.5, -0.5);
    glColor3f(0.1, 0.2, 0.5);
    glVertex2f(0.0, -0.5);
    glColor3f(0.3, 0.9, 0.7);
    glVertex2f(0.0, 0.5);
    glEnd();

    glutSwapBuffers(); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl visual-studio-2010 visual-c++

0
推荐指数
1
解决办法
1万
查看次数

如何检查OpenGL中画布上是否填充了像素?

我试图检测OpenGL中是否填充了特定像素,以实现泛洪填充算法.所以,我搜索并找到了glreadpixel函数,但我不知道如何使用这个函数以及它是否可以解决我的问题.

opengl glut pixel glreadpixels

0
推荐指数
1
解决办法
114
查看次数

OpenGL在绘制三角形之前我该做什么?

我在那里发现的大部分教程,指南和书籍都与OpenGL有关,解释了如何绘制三角形并初始化OpenGL.没关系.但当他们试图解释它时,他们只列出了一堆函数和参数,如:

glClear()
glClearColor()
glBegin()
glEnd()
...
Run Code Online (Sandbox Code Playgroud)

由于我不擅长通过记忆学习东西,我总是需要回答"为什么我们这样做?" 所以我会编写那么多函数,因为我记得在做其他事情之前我必须先设置一些东西,所以不要因为教程告诉了我.

可以请有人向我解释一下,在开始使用glBegin()和绘制内容之前,我需要为OpenGL定义什么(只有纯OpenGL,我使用SFML作为背景库,但这无关紧要)glEnd().

示例答案:

您必须首先告诉OpenGL清除屏幕所需的颜色.因为在我们开始绘制当前帧之前需要先清除每个帧...

c++ opengl

0
推荐指数
1
解决办法
1668
查看次数

俯仰偏转,角度独立

我正在努力弄清楚如何使它们之间的俯仰偏转和滚动独立.一旦我在z轴上旋转一些东西(俯仰),第二次旋转(yaxis yaw)取决于第一次和第三次旋转(x轴,滚动)的结果取决于另外两次.因此,我没有独立的音高,偏航,滚动,而是将它们三者混合在一起,很难看.

我希望有可能将对象角度存储在数组[俯仰,偏航,滚动]中,然后在变换过程中解码这些角度,以便偏航将对象放在给定位置,然后它取出与音高对应的角度,但是不是两者的复合......

我见过对"任意轴旋转矩阵"的引用.获得理想的结果会有用吗??? 1)应用偏航(gl.glRotatef(beta,0.0f,1.0f,0.0f);)2)得到手动旋转矢量的结果轴(1.0f,0.0f,0.0f)arround beta 3)应用音高使用轴进入2 {和滚动...如果1,2,3是正确的} 4)旋转轴2进入其x轴进行滚动5)使用轴进入4进行滚动

会有用吗?更好的解决方案?我想保持我的对象局部方向为[俯仰,偏航,滚动]格式.

我已经挣扎了几天,如果可能的话我想避免使用四元数.3D对象相对于0,0,0存储并沿着{1,0,0}并且转换到它们的目的地并且每帧都是角度,因此应该可以容易地避免万向节锁定问题.

换句话说,我的相机工作正常,世界坐标正确制作,但我不知道应该如何或在哪里应用基于偏航,髓,滚的物体局部变换.

应从数组[y,p,r]中读取结果,并且它们的组合不应重叠.

实际上我的转变是:

gl.glLoadIdentity(); 
float[] scalation = transform.getScalation();
gl.glScalef(scalation[0], scalation[1], scalation[2]); 
float[] translation = transform.getTranslation();
gl.glTranslatef(translation[0], translation[1], translation[2]);
float[] rotation = transform.getRotation();
gl.glRotatef(rotation[0], 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotation[1], 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotation[2], 0.0f, 0.0f, 1.0f);
Run Code Online (Sandbox Code Playgroud)

c++ opengl transformation angle jogl

0
推荐指数
1
解决办法
5640
查看次数

一个OpenGL qeustion:为什么glutSwapBuffer()函数不起作用?

这段代码来自红皮书,例2-15(嗯,代码不完全是书中的代码).照顾我记下的那张纸条.

#include <fstream>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glut.h>
#pragma comment(lib,"glew32.lib")
using namespace std;
#define BUFFER_OFFSET(offset) ((GLubyte *)NULL+offset)
#define XStart              -0.8
#define XEnd                0.8
#define YStart              -0.8
#define YEnd                0.8
#define NumXPoints          11
#define NumYPoints          11
#define NumPoints           (NumXPoints * NumYPoints)
#define NumPointsPerStrip   (2*NumXPoints)
#define NumStrips           (NumYPoints-1)
#define RestartIndex        0xffff

void display(void)
{
    int i,start;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1);
    glDrawElements(GL_TRIANGLE_STRIP,NumStrips*(NumPointsPerStrip+1),GL_UNSIGNED_SHORT,BUFFER_OFFSET(0));
    //glFlush();//it works,show a white square with black backgroud
    glutSwapBuffers();///it doesn't work,show what tha area looked like before

}

void init …
Run Code Online (Sandbox Code Playgroud)

opengl

0
推荐指数
1
解决办法
2268
查看次数

Opengl cpp代码在windows和mac上运行?

我想知道是否有任何if语法可用于在mac和windows上运行opengl c ++代码.更具体地说,在代码的开头,我可以设置一个if条件来确定代码是在mac(通常是xcode)还是windows(通常是visual c ++)上运行,并相应地包含头文件.

c++ windows opengl macos if-statement

0
推荐指数
1
解决办法
543
查看次数

GLSL纹理不起作用

考虑以下:

virtual void Draw()
{
    _texture->Bind(0);

    _shader->Begin();
    _shader->SetUniform("WVPMatrix", _mvp);
    _shader->SetUniform("InColor", _color);
    _shader->SetUniformImm("InTexture", 0);
    _vbo.GetDeclaration().Activate();
    _vbo.Render(GL_QUADS, _ibo, 4);
    _shader->End();
}

void Texture2D::Bind(int index)
{
    if (index != -1)
    {
        glActiveTexture(GL_TEXTURE0 + index);
    }

    glBindTexture(GL_TEXTURE_2D, _textureID);
}
Run Code Online (Sandbox Code Playgroud)

在哪里调用_shader-> Begin(),_ shader-> SetUniform,_shader-> SetUniformImm,_vbo.GetDeclaration().激活和_vbo.Render就像我设置片段着色器以呈现静态颜色(甚至颜色)一样通过制服)它变得很好.

现在我正在尝试渲染一个texture2d(它加载得很好,我用立即模式测试)然后我得到一个黑屏,为什么?

顶点:

#version 330

layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 VertexTexCoord;

uniform mat4 WVPMatrix;

out vec2 TexCoord0;

void main()
{
    TexCoord0 = VertexTexCoord;

    gl_Position = WVPMatrix * vec4(VertexPosition, 1);
}
Run Code Online (Sandbox Code Playgroud)

分段:

#version 330

in vec2 …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl

0
推荐指数
1
解决办法
1597
查看次数