我正在尝试将几个3d点投影到屏幕坐标,以确定触摸是否发生在大致相同的区域.应该注意的是,我在Kivy中这样做,这是Python和OpenGL.我看到的问题是这样,但我仍然没有解决.我尝试了以下内容,但数字并不接近屏幕坐标.
def to2D(self, pos, width, height, modelview, projection):
p = modelview*[pos[0], pos[1], pos[2], 0])
p = projection*p
a = p[0]
b = p[1]
c = p[2]
a /= c
b /= c
a = (a+1)*width/2.
b = (b+1)*height/2.
return (a, b)
Run Code Online (Sandbox Code Playgroud)
为了说明这不会产生良好的结果,请采用以下参数
modelview = [[-0.831470, 0.553001, 0.053372, 0.000000],
[0.000000, 0.096068, -0.995375, 0.000000],
[-0.555570, -0.827624, -0.079878, 0.000000],
[-0.000000, -0.772988, -2.898705, 1.000000]]
projection = [[ 15.763722, 0.000000, 0.000000, 0.000000],
[ 0.000000, 15.257052, 0.000000, 0.000000],
[ 0.000000, 0.000000, -1.002002, -2.002002],
[ …Run Code Online (Sandbox Code Playgroud) 据我所知,当我在GLFW上设置这些上下文约束时:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
Run Code Online (Sandbox Code Playgroud)
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3.但是,通过使用glGetString获取OpenGL上下文版本,我发现情况并非如此.每次我查询glGetString上下文版本时,我只会得到我设置的主要和次要版本glfwWindowHint,上面没有.请记住,我的GPU支持OpenGL 4.5.
另外需要注意的是,当我没有设置任何约束时,我确实得到了一个OpenGL 4.5上下文.
这是完整的源代码,似乎可以复制问题:
#define GLEW_STATIC
#include <iostream>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <glm\glm.hpp>
int main(int argc, char argv[])
{
if (!glfwInit())
{
std::cerr << "Failed to initialize GLFW 3.0.4" << std::endl;
getchar();
glfwTerminate();
return -1;
}
std::cout << "Initialized GLFW 3.0.4" << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* m_window = glfwCreateWindow(640, 480, "Koala", NULL, NULL);
if (!m_window)
{ …Run Code Online (Sandbox Code Playgroud) 我需要使用OpenGL为类设置Visual Studio.我找到了一个网站,解释了如何通过NuGet安装NupenGL包来获取OpenGL库和头文件.我按照说明操作,看到所有内容都安装到我的解决方案文件夹中的软件包/文件夹中,但我的项目绝对没有任何内容允许包含这些文件.
我需要做什么才能将NupenGL包中的库和头文件包含到我的项目中,以便它可以构建OpenGL代码?
我很确定这是因为我对GL_MODELVIEW矩阵的工作方式缺乏了解.这是一个屏幕录制正在发生的事情:http://youtu.be/3F7FLkVI7kA
如您所见,最底部的三角形是第一个绘制的三角形,并且随着我预期其他两个三角形移动而移动.第二个三角形相对于第一个三角形移动和旋转,第三个三角形相对于该组合移动和旋转.
我想要的是所有三个三角形在3D空间中是静止的,但是旋转(就像第一个三角形).
资源:
// Main loop
do {
// Clear Screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Update camera
glfwGetCursorPos(window, &cursorX, &cursorY);
cam.update(0.001f, (int)cursorX, (int)cursorY);
// Reset Matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// move camera
glRotatef(cam.rotation.x, 1.0f, 0.0f, 0.0f);
glRotatef(cam.rotation.y, 0.0f, 1.0f, 0.0f);
// translate modelview matrix to position of the camera - everything should now draw relative to camera position
glTranslatef(-cam.position.x, cam.position.y, -cam.position.z);
// Draw ground
drawGroundGrid(-25.0f);
drawSpinningTriangle(0.0f, 0.0f, -5.0f);
drawSpinningTriangle(3.14f, 3.0f, -6.0f);
drawSpinningTriangle(-6.0f, 12.0f, -5.0f);
// Swap buffers …Run Code Online (Sandbox Code Playgroud) 我想实现场景拾取(鼠标点击,移动等).什么是最好,最快的方式?我曾经使用glSelectBuffer和glRenderMode使用GL_SELECT然后再渲染整个场景(当然有提升,没有纹理,重型着色器等).
在每次鼠标单击,移动和拖动时递归渲染一个数字(几何ID)的所有节点和几何图形太慢.有人知道更好的方法吗?
编辑: 具有读取深度缓冲区的解决方案似乎很费劲,但如果我不想选择一些几何形状并且它们已经被淹没到缓冲区怎么办?包含点的查找框可能是不精确的,因为点可以在多个框中.
是否可以在一次绘制中写入两个帧缓冲区,深度缓冲区?然后我可以通过着色器将几何id写入一个缓冲区.速度怎么样?
我正在按照教程处理纹理加载,它有这个方法:
void CTexture::CreateEmptyTexture(int a_iWidth, int a_iHeight, GLenum format)
{
glGenTextures(1, &uiTexture);
glBindTexture(GL_TEXTURE_2D, uiTexture);
if(format == GL_RGBA || format == GL_BGRA)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
// We must handle this because of internal format parameter
else if(format == GL_RGB || format == GL_BGR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
else
glTexImage2D(GL_TEXTURE_2D, 0, format, a_iWidth, a_iHeight, 0, format, GL_UNSIGNED_BYTE, NULL);
glGenSamplers(1, &uiSampler);
}
Run Code Online (Sandbox Code Playgroud)
glGenSamplers是未定义的,我认为因为它需要GL v3.3或更高版本,我大学的实验室有GL v3.2所以我不能使用它.
我正在努力弄清楚glGenTextures和glGenSamplers之间的区别,它们是可以互换的吗?
我需要绘制一个立方体来指示OpenGL 3.3核心配置文件中的坐标.glutInitContextVersion (3, 3);它可以正常工作,但在glutInitContextVersion (3, 3);应用时它会变成全黑.这是绘图代码.
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers
glMatrixMode(GL_MODELVIEW); // To operate on model-view matrix
// Render a color-cube consisting of 6 quads with different colors
glLoadIdentity(); // Reset the model-view matrix
glTranslatef(1.5f, 0.0f, -7.0f); // Move right and into the screen
glBegin(GL_QUADS); // Begin drawing the color cube with 6 quads
// Top face (y = 1.0f)
// Define vertices in counter-clockwise (CCW) order with …Run Code Online (Sandbox Code Playgroud) 我试图实现位图字体渲染.唯一令我困惑的是,我必须在这里问一下,当我为每个焦点绘制四边形时,每次渲染一个新的四边形时,UV都绝对会被破坏.如果我只渲染一个四边形,一切都OK.
(瓦片x = 3,y = 4)
这是多少字母的样子.

这是我的代码来渲染这些东西:
...
rc.translate(getTransform().getPos());
drawTileAt(3, 4);
rc.translate(100, 0, 0);
drawTileAt(5, 5);
rc.translate(200, 0, 0);
drawTileAt(2,6);
rc.translate(300,0,0);
drawTileAt(1, 7);
...
public void drawTileAt(int x, int y)
{
float w = 1f / 16f;
float _x = 1f / 16f * x;
float _y = 1f / 16f * y;
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0, 100);GL11.glTexCoord2f(_x,_y);
GL11.glVertex2f(0, 0);GL11.glTexCoord2f(_x + w,_y);
GL11.glVertex2f(100,0);GL11.glTexCoord2f(_x + w,_y + w);
GL11.glVertex2f(100, 100);
GL11.glTexCoord2f(_x,_y + w);
GL11.glEnd();
}
Run Code Online (Sandbox Code Playgroud)
我也用tex-coords绘制VBO四边形,一切看起来都很好......
我有一个Qt应用程序QOpenGLWidget.在那个小部件中,我有我的OpenGL函数,它正如我所期望的那样呈现我的场景.
在那些渲染说明中,我放了以下几行,我得到了意想不到的结果:
void MyOpenGLVisualizer::paintGL()
{
GLint my_val = 0;
glGetIntegerv(GL_DRAW_BUFFER, &my_val);
std::cout << my_val << std::endl;
...
}
Run Code Online (Sandbox Code Playgroud)
这些行打印:36064这是0x8ce0.但根据glGet文档我希望它返回:GL_FRONT这是0x0404或者GL_BACK是0x0405.
我glGetError()在这些行之后调用,但它返回0.
我想,也许返回值是这些宏的OR-ED组合,但是这将包含所有的人: GL_BACK,GL_FRONT,等位.
那么,这36064意味着什么?
(如果有帮助,我使用Qt的OpenGL的包装:QOpenGLFunctions)
我正在尝试用LWJGL 3绘制一条线.它编译并且所有原生设置都正确设置.我在Ubuntu上运行.我真的不明白问题是什么; 窗口初始化,背景是正确的清晰颜色,但线条不会绘制.我几乎完全从我在新网站上找到的唯一示例中复制了代码.我不知道我做错了什么.
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.NULL;
import java.awt.DisplayMode;
import java.nio.ByteBuffer;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWKeyCallback;
import org.lwjgl.glfw.GLFWvidmode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GLContext;
import org.lwjgl.util.Display;
import org.lwjgl.util.glu.GLU;
public class Main {
// We need to strongly reference callback instances.
private static GLFWErrorCallback errorCallback;
private static GLFWKeyCallback keyCallback;
static final int INIT_WIDTH = 300;
static final int INIT_HEIGHT = 300;
// The window handle
private static long window;
public static boolean verbose = true;
public static void init() …Run Code Online (Sandbox Code Playgroud)