我目前运行的机器允许我在OpenGL 2.1中编程.如果我要制作一个程序,我应该使用当前OpenGL版本的强大功能,如3.x/4.x或使用2.1吗?
关于一个问题:我怎么知道我的计算机可以运行的OpenGL的最高版本是什么?
另一方面问题:只升级我的视频卡是否允许我在升级版的OpenGL中编程?
当在GLSL(a uniform sampler2D)中对2D纹理进行采样时,使用该texture函数并且从采样器推断尺寸(在这种情况下为2D).这是从1.30开始在GLSL中采样纹理的现代方法(GLSL参考页).但是,您也可以使用该texture2D功能.
该texture2D函数是否已弃用,如果是这样,是否会texture2D在某些版本的GLSL中删除(或已删除)该函数的支持?
我无法将投影和模型视图矩阵从我的PyOpenGL代码传递到GLSL着色器中.我的理解是OpenGL矩阵是列专业,但是当我传递投影和模型视图矩阵时,我看不到任何东西.我尝试了矩阵的转置,它适用于模型视图矩阵,但投影矩阵无论如何都不起作用.这是代码:
import OpenGL
from OpenGL.GL import *
from OpenGL.GL.shaders import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from OpenGL.GLUT.freeglut import *
from OpenGL.arrays import vbo
import numpy, math, sys
strVS = """
attribute vec3 aVert;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
uniform vec4 uColor;
varying vec4 vCol;
void main() {
// option #1 - fails
gl_Position = uPMatrix * uMVMatrix * vec4(aVert, 1.0);
// option #2 - works
gl_Position = vec4(aVert, 1.0);
// set color
vCol = vec4(uColor.rgb, … 我找到了一种理解为什么glActiveTexture需要的方法.我有以下代码:
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
Run Code Online (Sandbox Code Playgroud)
如果我想象这GL_TEXTURE_2D是挂在墙上的图片框架并且textureId是真实的图片,那么glBindTexture它是唯一一个将真实图片分配给框架的命令,那么,什么是GL_TEXTURE0和glActiveTexture?
我的代码可以正常工作吗?
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glActiveTexture(GL_TEXTURE1);
glTexImage2D(GL_TEXTURE_2D, .....)
glTexParameteri(GL_TEXTURE_2D, ...)
Run Code Online (Sandbox Code Playgroud)
我目前正在使用OpenGL2.1.
总是阻碍我做3D编程的一件事是无法理解数学是如何工作的.我可以使用方法和函数在编程流程中使用数学,然后它对我来说都是清晰和合乎逻辑的,但在数学符号中,我无法从它做出正面或反面.
我一直在阅读网站,观看研究所试图解释这个问题的视频,但他们都使用数学符号,我只是迷失在其中,我的思想不会将其转化为可理解的东西.我可能有缺陷.
另外,只是使用某人的代码不是我的兴趣,我想了解它背后的机制,逻辑.我很乐意使用其他人的代码,但我真的想了解它是如何工作的.
这个问题
你能用简单的术语向我解释没有数学符号,只是编程符号/函数/伪代码,如何沿所有3轴实现矩阵变换?
理想情况下我想要的是编写方法/对象的材料/理解,我可以在其中定义3个轴的角度,类似于glRotate,以旋转我所拥有的四边形/三角形的集合.(我正在尝试编写立方体形状的3D旋转而无需访问OpenGL函数来为我执行此操作,因为每次在显示列表中发生更改时,都会在一次绘制调用中完成.)
我做了什么?
我试图制作一个90度的变换函数来获得数学的悬念,但是在制作一个理论上最简单的矩阵时却完全失败了.你可以在http://jsfiddle.net/bLfg0tj8/5/看到我失败的尝试.
Vec3 = function(x,y,z) {
this.x = x;
this.y = y;
this.z = z;
}
Matrix = function Matrix() {
this.matrixPoints = new Array();
this.rotationPoint = new Vec3(0,0,0);
this.rotationAngle = 90;
}
Matrix.prototype.addVector = function(vector) {
this.matrixPoints.push(vector);
}
Matrix.prototype.setRotationPoint = function(vector) {
this.rotationPoint = vector;
}
Matrix.prototype.setRotationAngle = function(angle) {
this.rotationAngle = angle;
}
Matrix.prototype.populate = function() {
translateToOrigin = [[1,0,0-this.rotationPoint.x],
[0,1,0-this.rotationPoint.y],
[0,0,0-this.rotationPoint.z]];
rotationMatrix = [[0,-1,0],
[0,1,0],
[0,0,1]];
translateEnd …Run Code Online (Sandbox Code Playgroud)我一直在阅读有关计算机图形学的论文,而且我经常遇到在着色器代码中查询纹理的上下文中使用的术语"依赖纹理读取"或"依赖纹理提取".什么是依赖纹理读取,这与"普通"纹理读取有什么区别?
我使用GLEW和freeglut.出于某种原因,在调用glewInit()之后,glGetError()返回错误代码1280,即使使用glewExperimental = GL_FALSE也是如此.
我无法编译着色器,glGetProgramInfoLog()返回"在调用glLinkProgram()之前未成功编译顶点着色器.链接失败." 之前我能够编译着色器.
重新安装驱动程序没有帮助.
这是我的代码:
int main(int argc, char* argv[])
{
GLenum GlewInitResult, res;
InitWindow(argc, argv);
res = glGetError(); // res = 0
glewExperimental = GL_TRUE;
GlewInitResult = glewInit();
fprintf(stdout, "ERROR: %s\n", glewGetErrorString(GlewInitResult)); // "No error"
res = glGetError(); // res = 1280
glutMainLoop();
exit(EXIT_SUCCESS);
}
void InitWindow(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
GLUT_ACTION_GLUTMAINLOOP_RETURNS);
glutInitWindowPosition(0, 0);
glutInitWindowSize(CurrentWidth, CurrentHeight);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
WindowHandle = glutCreateWindow(WINDOW_TITLE);
GLenum errorCheckValue = glGetError();
if (WindowHandle …Run Code Online (Sandbox Code Playgroud) 我正在制作一个程序,它为不同的不同基元使用两个不同的着色器.我的问题是,如果我绑定一个程序,发送它统一变量,然后使用另一个着色器程序并回到第一个,传递的统一值是否仍然存在?这是一些伪代码:
glUseProgram(shader1);
glUniform(shader1,...);
//stuff
for(elements in a list) {
if(element.type = 1) {
glUseProgram(shader2);
element.draw();
} else {
glUseProgram(shader1); //Here, do the uniforms from above remain, if shader2 was bound before?
element.draw();
}
}
Run Code Online (Sandbox Code Playgroud) 比如gl_FragColor = v1 * v2,我真的无法得到它是如何相乘的,似乎参考给出了向量乘法矩阵的解释.
PS:该类型的v1和v2都是vec4.